通过旋转多列来重塑DataFrame

时间:2019-01-17 21:57:25

标签: python pandas pivot-table multi-index

嗨,我该如何旋转这样的桌子

import pandas as pd

d = {'name' : ['A','A','B','B'],'year': ['2018','2019','2018','2019'],'col1':[1,4,7,10],'col2':[2,5,8,11],'col3':[3,6,9,12]}

pd.DataFrame(data=d)

name    year    col1    col2    col3
   A    2018       1       2       3
   A    2019       4       5       6
   B    2018       7       8       9
   B    2019      10      11      12

像这样变成另一个:

name    cols    2018    2019
   A    col1    1       4
   A    col2    2       5
   A    col3    3       6
   B    col1    7       10
   B    col2    8       11
   B    col3    9       12

year将成为列,每个列都应使用名称进行迭代以形成将用作组合主键的对。

2 个答案:

答案 0 :(得分:6)

您可以使用meltpivot_table

(df.melt(['name','year'], var_name='cols')
   .pivot_table(index=['name', 'cols'], 
                columns='year', 
                values='value', 
                aggfunc='sum')
   .reset_index()
   .rename_axis(None, 1))

  name  cols  2018  2019
0    A  col1     1     4
1    A  col2     2     5
2    A  col3     3     6
3    B  col1     7    10
4    B  col2     8    11
5    B  col3     9    12

基于stackunstack的替代解决方案:

(df.set_index(['name','year'])
   .stack()
   .unstack(1)
   .rename_axis(['name', 'cols'], 0)
   .rename_axis(None, 1)
   .reset_index())

  name  cols  2018  2019
0    A  col1     1     4
1    A  col2     2     5
2    A  col3     3     6
3    B  col1     7    10
4    B  col2     8    11
5    B  col3     9    12

答案 1 :(得分:3)

使用wide_to_long

pd.wide_to_long(df,['col'],i=['name','year'],j='cols').col.unstack(level=1).reset_index()
Out[573]: 
year name  cols  2018  2019
0       A     1     1     4
1       A     2     2     5
2       A     3     3     6
3       B     1     7    10
4       B     2     8    11
5       B     3     9    12