【问题标题】:Reshape DataFrame by pivoting multiple columns通过旋转多列来重塑 DataFrame
【发布时间】:2019-06-12 04:20:35
【问题描述】:

您好,我怎样才能像这样旋转表格

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 将成为列,并且每列都应使用名称进行迭代以形成将用作组合主键的对。

【问题讨论】:

    标签: python pandas pivot-table multi-index


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 很好的解决方案@coldspeed。我只是删除了aggfunc='sum',这样我就可以将空值保留为 NaN 以将它们作为 NULL 上传到数据库中,而不是 0(零),因为“总和”会误导。
    【解决方案2】:

    使用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
    

    【讨论】:

      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      相关资源
      最近更新 更多