熊猫,融化,未融化保留指数
Posted
技术标签:
【中文标题】熊猫,融化,未融化保留指数【英文标题】: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_i
和sum 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
有什么方法可以在使用熔体时保留我的索引的“铜”部分?
【问题讨论】:
【参考方案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
【讨论】:
看来,其实叫“ignore_index”:pandas.pydata.org/docs/reference/api/pandas.DataFrame.melt.html以上是关于熊猫,融化,未融化保留指数的主要内容,如果未能解决你的问题,请参考以下文章