[pandas]:对列进行分组,然后同时定义多个(包括一些自定义的)聚合函数

问题描述 投票:0回答:1

我需要能够在一个 groupby/agg 语句中定义两个单独列的总和和除法,并将它们保存为一个新列,然后计算另一列的总和。

Mods,请在查看此问题之前先检查我想要的输出。查看此站点上的其他问题,我只能弄清楚如何为一个聚合列而不是多个编写自定义聚合函数。

例如,Python - Pandas data frame: customized aggregation function after groupy? 问了一个类似的问题,但没有提供关于如何同时为多个列定义自定义函数的建议。


以下是问题陈述、我尝试的解决方案以及我想要的结果。

这是我的数据框:

df = pd.DataFrame({'location': ['backyard', 'store', 'bank', 'backyard', 'backyard', 'bank', 'store'],
                   'is_orange': [1, 1, 0, 0, 1, 0, 1],
                   'is_non_orange': [0, 0, 1, 1, 0, 1, 0],
                   'melons':     [73, 81, 94, 174, 23, 71, 65]})

我想做这样的事情:

df.groupby(['location']).agg(
    'total orange/non-orange' : df['is_orange'] + df['is_non_orange'],
    'percent_orange'          : df['is_orange'] / (df['is_orange'] + df['is_non_orange']),
    'sum_melons'              : sum(df['melons']))

所需的输出为:

df = 

location    total_orange/non-orange    percentage_oranges    melons
backyard                        3.0                  0.66       270
bank                            2.0                  0.00       165
store                           2.0                  1.00       146

提前致谢。

python-3.x pandas dataframe group-by aggregate
1个回答
0
投票

一个可能的解决方案(由 Python Discord 服务器上的 shimmer 建议):

定义数据框:

import pandas as pd

df = pd.DataFrame({'location': ['backyard', 'store', 'bank', 'backyard', 'backyard', 'bank', 'store'],
                   'is_orange': [1, 1, 0, 0, 1, 0, 1],
                   'is_non_orange': [0, 0, 1, 1, 0, 1, 0],
                   'melons':     [73, 81, 94, 174, 23, 71, 65]})

我们可以写:

df2 = pd.DataFrame()
df  = df.groupby('location').agg('sum')
df2['total_oranges'] = df['is_orange'] + df['is_non_orange']
df2['percentage_orange'] = df['is_orange'] / (df['is_orange'] + df['is_non_orange'])
df2['melons'] = df['melons']

输出为:

    total_oranges   percentage_orange   melons
location            
backyard    3   0.666667    270
bank    2   0.000000    165
store   2   1.000000    146

我喜欢这个答案,因为它非常简单。我唯一担心的是这种方法可能增加的空间复杂性。也许有一种方法可以使用

.apply()
函数来消除这种担忧。

© www.soinside.com 2019 - 2024. All rights reserved.