微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-在透视期间选择不同的聚合函数

数据框:

df = pd.DataFrame({'First' : ['Mary', 'John', 'Jane', 'Mary', 'Jane', 'Mary', 'Mary'], 
                   'Last' : ['Johnson', 'Smith', 'Doe', 'Johnson', 'Doe', 'Johnson', 'Johnson'], 
                   'Group' : ['A', 'A', 'B', 'A', 'B', 'B', 'B'], 
                   'Measure' : [10, 2, 11, 1, 20, 15, 15]})

  First     Last Group  Measure
0  Mary  Johnson     A       10
1  John    Smith     A        2
2  Jane      Doe     B       11
3  Mary  Johnson     A        1
4  Jane      Doe     B       20
5  Mary  Johnson     B       15
6  Mary  Johnson     B       15

一个人可以出现在两个组中,这些数据中有期望和想要的重复项.

我想通过在列之间分布Group变量来重塑数据框.

我可以使用pivot_table()来做到这一点:

df.pivot_table(index=['First','Last'],
               columns='Group',
               values='Measure',
               fill_value=0).reset_index()

Group First     Last    A     B
0      Jane      Doe  0.0  15.5
1      John    Smith  2.0   0.0
2      Mary  Johnson  5.5  15.0

认情况下,将根据“度量”对每个分组使用均值.我想基于来自原始Group变量的新生成的列指定聚合函数.在这种情况下,我想在A列上使用Max,在B列上使用sum.所需的输出

  First     Last   A   B
0  Mary  Johnson  10  30
1  John    Smith   2   0
2  Jane      Doe   0  31

例如玛丽·约翰逊.对于她在GroupA中的值,最大值为10.对于她在B组中的值,总和为30.

尝试过:

df.pivot_table(index=['First','Last'],
               columns='Group',
               values='Measure',
               fill_value=0,
               aggfunc = {'A': max,
                          'B': sum}).reset_index()

导致出现错误消息KeyError:“ A”

如何透视数据框并在透视之后根据新列指定聚合函数

解决方法:

您可以始终同时指定并且仅过滤

ndf = df.pivot_table(index=['First','Last'],
               columns='Group',
               values='Measure',
               fill_value=0,
               aggfunc=['sum', 'max'])

ndf.loc[:, ((ndf.columns.get_level_values(0)=='max') & (ndf.columns.get_level_values(1)=='A') ) | \
           ((ndf.columns.get_level_values(0)=='sum') & (ndf.columns.get_level_values(1)=='B') )]

                  sum   max
        Group     B     A
First   Last        
Jane    Doe       31    0
John    Smith     0     2
Mary    Johnson   30    10

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐