通过重复行重塑pandas数据帧

时间:2017-09-11 07:48:50

标签: python pandas numpy dataframe

我是Python的新手,特别是Pandas。 我有一个像

这样的数据框
-----------------------------------------------------
Id     Name    Salary    desc1     desc2     desc3
-----------------------------------------------------
1      ABC1    2000       x1        y1        z1
-----------------------------------------------------
2      ABC2    5000       x2        y1        z2
-----------------------------------------------------

我想把它变成这种方式

-----------------------------------------
ID     Name     Salary      Variable
-----------------------------------------
1      ABC1      2000          x1
-----------------------------------------
1      ABC1      2000          y1
-----------------------------------------
1      ABC1      2000          z1  
-----------------------------------------
2      ABC2      5000          x2  
-----------------------------------------
2      ABC2      5000          y2  
-----------------------------------------
2      ABC2      5000          z2 
-----------------------------------------

请帮忙。提前谢谢。

1 个答案:

答案 0 :(得分:2)

您需要set_index + stack

df = df.set_index(['Id','Name','Salary'])
       .stack()
       .reset_index(level=3, drop=True)
       .reset_index(name='Variable')

print (df)
   Id  Name  Salary Variable
0   1  ABC1    2000       x1
1   1  ABC1    2000       y1
2   1  ABC1    2000       z1
3   2  ABC2    5000       x2
4   2  ABC2    5000       y1
5   2  ABC2    5000       z2

如果不需要排序前3列:

使用melt

df = df.melt(['Id','Name','Salary'], value_name='Variable').drop('variable', axis=1)
print (df)
   Id  Name  Salary Variable
0   1  ABC1    2000       x1
1   2  ABC2    5000       x2
2   1  ABC1    2000       y1
3   2  ABC2    5000       y1
4   1  ABC1    2000       z1
5   2  ABC2    5000       z2

lreshape现在没有记录,但将来可能会删除(github link)。

df = pd.lreshape(df, {'Variable':['desc1','desc2','desc3']})
print (df)
   Id  Name  Salary Variable
0   1  ABC1    2000       x1
1   2  ABC2    5000       x2
2   1  ABC1    2000       y1
3   2  ABC2    5000       y1
4   1  ABC1    2000       z1
5   2  ABC2    5000       z2