bugfix> python > 投稿

クライアント(銅)と資産配分(資産)の表があります

A = [[1,2],[3,4],[5,6]]
idx = ['coper1','coper2','coper3']
cols = ['asset1','asset2']
df = pd.DataFrame(A,index = idx, columns = cols)

私のデータは次のようになります

       asset1  asset2
coper1       1       2
coper2       3       4
coper3       5       6

線形最適化を実行したい(制約があります- sum of all of asset_i <= amount_on_hand_i のようなsomtehingおよび sum of coper_j = price_j

したがって、この2D行列を1Dベクトルに変換する必要があります。メルトで簡単

df2 = pd.melt(df,value_vars=['asset1','asset2'])

しかし、今、それを解こうとすると、空白がたくさんある6行の配列が得られます!

df2.pivot(columns = 'variable', values = 'value')

variable  asset1  asset2
0            1.0     NaN
1            3.0     NaN
2            5.0     NaN
3            NaN     2.0
4            NaN     4.0
5            NaN     6.0

メルトを使用しながら、インデックス作成の「銅」部分を保持する方法はありますか?

回答 1 件
  • reset_index でインデックス値を保持する必要があります  およびパラメーター id_vars

    df2 = pd.melt(df.reset_index(), id_vars='index',value_vars=['asset1','asset2'])
    print (df2)
        index variable  value
    0  coper1   asset1      1
    1  coper2   asset1      3
    2  coper3   asset1      5
    3  coper1   asset2      2
    4  coper2   asset2      4
    5  coper3   asset2      6
    
    

    その後、ピボットはうまく動作します:

    print(df2.pivot(index='index',columns = 'variable', values = 'value'))
    variable  asset1  asset2
    index                   
    coper1         1       2
    coper2         3       4
    coper3         5       6
    
    

    stack の別の可能な解決策 :

    df2 = df.stack().reset_index()
    df2.columns = list('abc')
    print (df2)
            a       b  c
    0  coper1  asset1  1
    1  coper1  asset2  2
    2  coper2  asset1  3
    3  coper2  asset2  4
    4  coper3  asset1  5
    5  coper3  asset2  6
    print(df2.pivot(index='a',columns = 'b', values = 'c'))
    b       asset1  asset2
    a                     
    coper1       1       2
    coper2       3       4
    coper3       5       6
    
    

あなたの答え