【问题标题】:How to group a python data frame by multilevel rows?如何按多级行对python数据框进行分组?
【发布时间】:2018-08-03 12:58:27
【问题描述】:

我有以下多级数据框:

Year   2016                    2017                 
Quarter  3   4                 1                 2      
Month  Sep   Oct   Nov   Dec   Jan  Feb    Mar   Apr   May   Jun
A      0.16  0.95  0.92  0.45  0.30  0.35  0.95  0.88  0.18  0.10
B      0.88  0.67  0.07  0.70  0.74  0.33  0.77  0.21  0.81  0.85
C      0.79  0.56  0.13  0.19  0.94  0.23  0.72  0.62  0.66  0.93

我想总结一下季度,所以最终的结果如下:

Year     2016        2017   
Quarter  3     4     1     2
A        0.16  2.32  1.60  1.16
B        0.88  1.44  1.85  1.86
C        0.79  0.89  1.89  2.21

我尝试了以下公式:

df= df.groupby('Quarter').transform('sum')

但我收到此错误:

KeyError: 'Quarter'

显然这是错误的处理方式。任何人都可以请一个解决方案或接近找到一个。

其他信息

df.index 命令的输出是:Index([u'A', u'B',u'C'],dtype='object', name=u'DF name')

谢谢!

【问题讨论】:

  • 如@Matt Messersmith 所述,您能否提供生成数据框的代码?

标签: python pandas pandas-groupby


【解决方案1】:

只使用sum

df.sum(level=[0,1],axis=1)
Out[14]: 
year    2016        2017      
quater     3     4     1     2
A       0.16  2.32  1.60  1.16
B       0.88  1.44  1.84  1.87
C       0.79  0.88  1.89  2.21

【讨论】:

  • 这是我收到的错误ValueError: No axis named 1 for object type <class 'pandas.core.series.Series'>
  • @Newskooler df.sum(level=['Year','Quater'],axis=1)
  • 成功了。它第一次不起作用的原因是因为我有df=df.replace(0, '')。显然是我这边的一个错误。谢谢!
  • @Newskooler Ha ,你愿意考虑接受吗?
【解决方案2】:

当您在 pandas 中使用 groupby 时,您会根据列数据对数据进行分组。但是你有你的组在行。您所需要的只是在分组之前和之后转置您的 df 。

这是您需要的代码:

首先让我们像你一样创建 df:

import pandas as pd

index = pd.MultiIndex.from_tuples([(2016, 3, 'Sep', 'A'),
                                   (2016, 3, 'Sep', 'B'),
                                   (2016, 3, 'Sep', 'C'),
                                   (2016, 4, 'Oct', 'A'),
                                   (2016, 4, 'Oct', 'B'),
                                   (2016, 4, 'Oct', 'C'),
                                   (2016, 4, 'Nov', 'A'),
                                   (2016, 4, 'Nov', 'B'),
                                   (2016, 4, 'Nov', 'C'),
                                   (2017, 1, 'Jan', 'A'),
                                   (2017, 1, 'Jan', 'B'),
                                   (2017, 1, 'Jan', 'C'),
                                   (2017, 1, 'Feb', 'A'),
                                   (2017, 1, 'Feb', 'B'),
                                   (2017, 1, 'Feb', 'C'),
                                   ], names=['Year', 'Quarter', 'Month', 'Group'])

raw_df = pd.Series(range(15), index=index)

df = raw_df.unstack([0,1,2])
print(df)

输出:

Year    2016         2017    
Quarter    3   4        1    
Month    Sep Oct Nov  Jan Feb
Group                        
A          0   3   6    9  12
B          1   4   7   10  13
C          2   5   8   11  14

看起来与您的示例完全相同。现在您只需要 1 行代码:

new_df = df.transpose().groupby(['Year', 'Quarter']).sum().transpose()
print(new_df)

这是你的输出:

Year    2016     2017
Quarter    3   4    1
Group                
A          0   9   21
B          1  11   23
C          2  13   25

祝你好运!

【讨论】:

    【解决方案3】:

    df.sum(level=['Year', 'Quater'], axis=1)

    编辑:感谢Matt Messersmith关于转置的说明

    复制完整示例

    import pandas as pd
    
    tuples = [(2016, 3, 'Sep'), (2016, 4, 'Oct'), (2016, 4, 'Nov'),
              (2016, 4, 'Dec'), (2017, 1, 'Jan'), (2017, 1, 'Feb'),
              (2017, 1, 'Mar'), (2017, 2, 'Apr'), (2017, 2, 'May'),
              (2017, 2, 'Jun')]
    
    index = pd.MultiIndex.from_tuples(tuples, names=['Year', 'Quater', 'Month'])
    
    df = pd.DataFrame([(0.16, 0.88, 0.79), (0.95, 0.67, 0.56), (0.92, 0.07, 0.13), 
                       (0.45, 0.70, 0.19), (0.30, 0.74, 0.94), (0.35, 0.33, 0.23), 
                       (0.95, 0.77, 0.72), (0.88, 0.21, 0.62), (0.18, 0.81, 0.66), 
                       (0.10, 0.85, 0.93)], 
                      index=index, 
                      columns=["A", "B", "C"])
    df = df.T
    print(df.sum(level=['Year', 'Quater'], axis=1))
    

    【讨论】:

    • 我也试过了,但我收到以下错误ValueError: level > 0 only valid with MultiIndex
    • @Newskooler 你能提供这行的结果吗print(df.index)?
    • 这是结果Index([u'A', u'B', u'C'], dtype='object', name=u'DF name')
    • 您能否提供代码来生成数据框,并将 print(df.index) 输出移动到问题中,以便其他人无需滚动推荐即可看到它
    • 我认为您需要转置您创建的数据框,然后进行求和。
    【解决方案4】:

    您可以尝试转置数据,然后按您想要的索引sum 并按照您想要的方式转置它

    df.transpose().sum(level=[0,1]).transpose()
    

    如果您需要调整结果。

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 2021-06-25
      • 2022-01-22
      • 2019-08-29
      • 1970-01-01
      • 2022-01-13
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多