Pandas中的melt和unmelt函数是否会保留索引?

46

我有一张客户信息表(coper)和资产配置表(asset)。

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

我想对它们进行线性优化(我有一些约束,例如所有资产_i的总和≤手头金额_icoper_j的总和=价格_j

因此,我必须将这个二维矩阵转换为一维向量。使用melt很容易实现。

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

使用melt时是否有办法保留我的索引中的 "coper" 部分?

3个回答

73

您需要使用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

22
将 ignore_index 设置为 False 以保留索引,例如:
df = df.melt(var_name=‘species’, value_name=‘height’, ignore_index = False)

注意:这需要 pandas >= 1.1 - normanius

4

1
看起来,它实际上被称为"ignore_index":https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.melt.html - Make42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接