首页 > 解决方案 > MELT:不重复的多个值

问题描述

不能这么难。我有

df=pd.DataFrame({'id':[1,2,3],'name':['j','l','m'], 'mnt':['f','p','p'],'nt':['b','w','e'],'cost':[20,30,80],'paid':[12,23,45]})

我需要

 import numpy as np
df1=pd.DataFrame({'id':[1,2,3,1,2,3],'name':['j','l','m','j','l','m'], 't':['f','p','p','b','w','e'],'paid':[12,23,45,np.nan,np.nan,np.nan],'cost':[20,30,80,np.nan,np.nan,np.nan]})

我有 45 列要反转。

我试过了

(df.set_index(['id', 'name'])
   .rename_axis(['paid'], axis=1)
   .stack().reset_index())

标签: python-3.xpandas

解决方案


编辑:我认为这里最简单的是按variable列设置缺失值DataFrame.melt

df2 = df.melt(['id', 'name','cost','paid'], value_name='t')       
df2.loc[df2.pop('variable').eq('nt'), ['cost','paid']] = np.nan

print (df2)
   id name  cost  paid  t
0   1    j  20.0  12.0  f
1   2    l  30.0  23.0  p
2   3    m  80.0  45.0  p
3   1    j   NaN   NaN  b
4   2    l   NaN   NaN  w
5   3    m   NaN   NaN  e

使用lreshape列表字典来指定哪些列'grouped'在一起:

df2 = pd.lreshape(df, {'t':['mnt','nt'], 'mon':['cost','paid']})
print (df2)
   id name  t  mon
0   1    j  f   20
1   2    l  p   30
2   3    m  p   80
3   1    j  b   12
4   2    l  w   23
5   3    m  e   45

推荐阅读