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
pandas, melt, unmelt preserve index
提问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_i
and 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_index
and 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