使用pandas melt时如何保留coper索引?适配线性优化需求
问题:用pandas Melt转一维向量时如何保留客户索引,实现正确反向重塑?
你遇到的问题很典型——当你把二维的客户-资产表格转成一维向量用于线性优化时,melt操作默认丢掉了客户(coper)的索引信息,导致后续反向pivot时没办法把同一客户的资产值对应到同一行,才会出现满是NaN的分散结果。
咱们直接看解决方案:
方法1:先把索引转成普通列再Melt
这是最通用的方法,不管你用哪个版本的pandas都能生效:
首先把原来的coper索引转成一个普通列,然后在melt时指定这个列作为分组标识(id_vars),这样就能保留每个资产值对应的客户信息:
# 第一步:把索引转为名为coper的列 df_reset = df.reset_index().rename(columns={'index': 'coper'}) # 第二步:执行melt,保留coper作为分组依据 df2 = df_reset.melt( id_vars='coper', value_vars=['asset1','asset2'], var_name='asset', value_name='amount' )
生成的df2会是这样的结构化数据:
coper asset amount 0 coper1 asset1 1 1 coper2 asset1 3 2 coper3 asset1 5 3 coper1 asset2 2 4 coper2 asset2 4 5 coper3 asset2 6
这时再执行反向pivot,就能完美还原你的原始DataFrame:
df_original = df2.pivot(index='coper', columns='asset', values='amount')
输出结果和你最初的表格完全一致:
asset asset1 asset2 coper coper1 1 2 coper2 3 4 coper3 5 6
方法2:直接在Melt时保留索引(Pandas 1.1.0+适用)
如果你的pandas版本在1.1.0及以上,可以直接用ignore_index=False参数让melt保留原始索引,省掉手动转列的步骤:
# 保留原始索引执行melt df2 = df.melt( value_vars=['asset1','asset2'], var_name='asset', value_name='amount', ignore_index=False ) # 把索引转为coper列(方便后续pivot操作) df2 = df2.reset_index().rename(columns={'index': 'coper'})
得到的df2和方法1的结果完全一样,后续的反向重塑操作也相同。
为什么你之前的操作会失败?
你之前的melt没有指定任何分组标识,生成的df2里只有资产类型和对应数值,没有任何能关联到具体客户的信息。pivot的时候没办法判断哪些值属于同一个客户,只能把每个数值单独放在一行,自然就出现了大量的NaN。
内容的提问来源于stack exchange,提问作者Mohammad Athar
相关产品推荐
相关产品推荐

