我需要能够在一个 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 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()
函数来消除这种担忧。