pandas 熊猫,融化,未融化保存指数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/50529022/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 05:36:03  来源:igfitidea点击:

pandas, melt, unmelt preserve index

pythonpython-2.7pandaslinear-programming

提问by Mohammad Athar

I've got a table of clients (coper) and asset allocation (asset)

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

A = [[1,2],[3,4],[5,6]]
idx = ['coper1','coper2','coper3']
cols = ['asset1','asset2']

df = pd.DataFrame(A,index = idx, columns = cols)

so my data look like

所以我的数据看起来像

        asset1  asset2
coper1       1       2
coper2       3       4
coper3       5       6

and I want to run them through a linear optimization (i've got constraints- somtehing like sum of all of asset_i <= amount_on_hand_iand sum of coper_j = price_j)

我想通过线性优化来运行它们(我有约束 - 像sum of all of asset_i <= amount_on_hand_i和一样sum of coper_j = price_j

so I have to turn this 2D matrix into a 1D vector. Which is easy with melt

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

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

But now, when I try to unmelt it, I get a 6-row array with lots of blanks!

但是现在,当我尝试解开它时,我得到了一个有很多空白的 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

Is there any way to preserve the 'coper' part of my indexing while using melt?

有什么办法可以在使用melt时保留索引的“铜”部分?

回答by jezrael

You need preserve index values by reset_indexand parameter id_vars:

您需要通过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

Then pivot working nice:

然后枢轴工作得很好:

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

Another possible solution with stack:

另一个可能的解决方案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