【问题标题】:pandas, melt, unmelt preserve index熊猫,融化,未融化保留指数
【发布时间】:2018-11-04 20:13:40
【问题描述】:

我有一张客户表(铜)和资产配置(资产)

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_isum of coper_j = price_j

所以我必须把这个二维矩阵变成一维向量。哪个容易融化

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

有什么方法可以在使用熔体时保留我的索引的“铜”部分?

【问题讨论】:

    标签: python python-2.7 pandas linear-programming


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      将 ignore_index 设置为 False 以保留索引,例如

      df = df.melt(var_name=‘species’, value_name=‘height’, ignore_index = False)
      

      【讨论】:

      • 注意:这需要 pandas >= 1.1
      【解决方案3】:

      看起来“数据框融化方法的可选参数 keep_index”进入了 1.1 版:https://github.com/pandas-dev/pandas/issues/17440

      【讨论】:

      猜你喜欢
      • 2020-03-11
      • 2020-09-16
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多