为了账号安全,请及时绑定邮箱和手机立即绑定

如何按多层行对python数据框进行分组?

如何按多层行对python数据框进行分组?

繁花不似锦 2021-05-14 18:27:15
我有以下多级数据框架:Year   2016                    2017                 Quarter  3   4                 1                 2      Month  Sep   Oct   Nov   Dec   Jan  Feb    Mar   Apr   May   JunA      0.16  0.95  0.92  0.45  0.30  0.35  0.95  0.88  0.18  0.10B      0.88  0.67  0.07  0.70  0.74  0.33  0.77  0.21  0.81  0.85C      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     2A        0.16  2.32  1.60  1.16B        0.88  1.44  1.85  1.86C        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')
查看完整描述

3 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

在熊猫中使用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

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


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

祝你好运!


查看完整回答
反对 回复 2021-05-18
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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


重现完整示例:


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))


查看完整回答
反对 回复 2021-05-18
  • 3 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信