Pandas 分组 - 创建通用聚合函数

Pandas Grouping - Creating a Generic Aggregation Function

我需要对数据进行大量聚合,我希望编写一个允许我通过的函数

1) 用于分组的字符串 2) 构成numerator/denominator/ 和公式

的字段

由于我将使用不同的分组以及不同的分子和分母对数据进行大量削减,因此创建一个通用分组依据并传递我需要的内容对我来说会更容易

那么让我们举个例子:

import pandas as pd
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
(df.groupby(['sex', 'smoker'])[['total_bill','tip']].sum().apply(lambda r: r.tip/r.total_bill, axis = 1))

现在,我想创建一个函数,允许我按值和分子分母字段传递一个组

所以,例如

groupbyvalue=['sex', 'smoker']
fieldstoaggregate=['tip','total_bill']

然后将它们插入

(df.groupby(groupbyvalue)[fieldstoaggregate].sum().apply(lambda r: r.tip/r.total_bill, axis = 1))

这很好用,但是当我尝试用类似的东西替换公式时:

dfformula="r.tip/r.total_bill"

然后放入公式如下

(df.groupby(groupbyvalue)[fieldstoaggregate].sum().apply(lambda r: dfformula, axis = 1)*10000)

我的输出如下所示:

sex     smoker
Female  No        r.tip/r.total_billr.tip/r.total_billr.tip/r.to...
        Yes       r.tip/r.total_billr.tip/r.total_billr.tip/r.to...
Male    No        r.tip/r.total_billr.tip/r.total_billr.tip/r.to...
       Yes       r.tip/r.total_billr.tip/r.total_billr.tip/r.to...
dtype: object

有什么方法可以动态创建计算然后在公式中使用它而不是将其解释为字符串?

谢谢

您可以使用 eval() 函数实现此目的

import pandas as pd

df = pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')

groupbyvalue = ['sex', 'smoker']
fieldstoaggregate = ['tip','total_bill']
dfformula = "r.tip/r.total_bill"

(df.groupby(groupbyvalue)[fieldstoaggregate].sum().apply(lambda r: eval(dfformula), axis = 1))

输出结果如下

sex     smoker
Female  No        0.153189
        Yes       0.163062
Male    No        0.157312
        Yes       0.136919
dtype: float64