根据列值转置数据框列-Pandas

时间:2019-10-21 05:54:49

标签: python-3.x pandas

我有一个这样的数据框,

    param       per     per_date    per_num             
0   XYZ         1.0     2018-10-01  11.0                
1   XYZ         2.0     2017-08-01  15.25               
2   XYZ         3.0     2019-10-01  11.25               
3   MMG         1.0     2019-08-01  15.71               
4   MMG         2.0     2020-10-01  11.50               
5   MMG         3.0     2021-10-01  11.75               
6   MMG         4.0     2014-01-01  14.00

我想要这样的输出

 param per_1  per_2   per_3   per_4 per_date_1 per_date_2 per_date_3 per_date_4 per_num_1 per_num_2 per_num_3 per_num_4
0 XYZ   1      2       3       NaN  2018-10-01 2017-08-01 2019-10-01 NaN        11.0      15.25     11.25     NaN
1 MMG   1      2       3       4    2019-08-01 2020-10-01 2021-10-01 2014-01-01 15.71     11.50     11.75     14.00

我尝试了以下

df.vstack().reset_index().drop('level_1',axis=0)

这没有给我我需要的输出。

如果看到的话,我的per列具有递增值,在我对它们进行转置时可以将它们添加到列名中。

任何建议都会很棒。

1 个答案:

答案 0 :(得分:2)

使用GroupBy.cumcount进行计数,并用DataFrame.unstack进行整形,最后用f-string s来使列名称变平:

df = df.set_index(['param', df.groupby('param').cumcount().add(1)]).unstack()
df.columns = [f'{a}_{b}' for a, b in df.columns]
df = df.reset_index()
print (df)
  param  per_1  per_2  per_3  per_4  per_date_1  per_date_2  per_date_3  \
0   MMG    1.0    2.0    3.0    4.0  2019-08-01  2020-10-01  2021-10-01   
1   XYZ    1.0    2.0    3.0    NaN  2018-10-01  2017-08-01  2019-10-01   

   per_date_4  per_num_1  per_num_2  per_num_3  per_num_4  
0  2014-01-01      15.71      11.50      11.75       14.0  
1         NaN      11.00      15.25      11.25        NaN