Python 分组-创建通用聚合函数
我需要对数据进行大量的聚合,我希望编写一个函数,使我能够通过 1) 用于分组的字符串 2) 构成分子/分母/和公式的字段 由于我将使用不同的分组、不同的分子和分母对数据进行大量切割,因此我更容易创建一个通用分组,并根据需要传递它 因此,让我们以以下示例为例:Python 分组-创建通用聚合函数,python,pandas,dataframe,aggregate,aggregation,Python,Pandas,Dataframe,Aggregate,Aggregation,我需要对数据进行大量的聚合,我希望编写一个函数,使我能够通过 1) 用于分组的字符串 2) 构成分子/分母/和公式的字段 由于我将使用不同的分组、不同的分子和分母对数据进行大量切割,因此我更容易创建一个通用分组,并根据需要传递它 因此,让我们以以下示例为例: import pandas as pd df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',') (
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
您可以使用
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
令人惊叹的!!谢谢你真棒!!非常感谢。