首页 > 解决方案 > pandas 数据框中的 apply 方法传递给应用的函数是什么

问题描述

我是 pandas 的新手,我对 pandas 究竟传递给 apply 方法参数中指定的函数感到好奇。这是python课程中数据科学介绍的一个例子

使用以下数据:

                       Category  Quantity  Weight (oz.)
Item                                                   
Pack                       Pack         1          33.0
Tent                    Shelter         1          80.0
Sleeping Pad              Sleep         1          27.0
Sleeping Bag              Sleep         1          20.0
Toothbrush/Toothpaste    Health         1           2.0
Sunscreen                Health         1           5.0
Medical Kit              Health         1           3.7
Spoon                   Kitchen         1           0.7
Stove                   Kitchen         1          20.0
Water Filter            Kitchen         1           1.8
Water Bottles           Kitchen         2          35.0
Pack Liner              Utility         1           1.0
Stuff Sack              Utility         1           1.0
Trekking Poles          Utility         1          16.0
Rain Poncho            Clothing         1           6.0
Shoes                  Clothing         1          12.0
Hat                    Clothing         1           2.5

目标是按类别计算总重量(重量 x 数量)。我已经明白我们需要使用 Groupby 方法将数据分成块,然后使用 apply 来完成其余的工作。

这是问题的正确答案

print(df.groupby('Category').apply(lambda df,a,b: sum(df[a] * df[b]), 'Weight (oz.)', 'Quantity'))

这就是我感到困惑的地方。我不知道为什么它会起作用。Pandas 究竟将什么传递给匿名函数?它总是首先是数据框本身,然后是列的名称(如果指定)?

如果您能帮助我理解这一点,我将不胜感激

标签: pythonpandasdataframe

解决方案


我认为您首先需要多个列,然后再聚合sum

df['Weight (oz.)'].mul(df['Quantity']).groupby(df['Category']).sum().reset_index(name='wsum')

或者:

(df.assign(wsum = df['Weight (oz.)'].mul(df['Quantity']))
   .groupby('Category', as_index=False)['wsum'].sum())

您的解决方案应该更改为每组多个,但如果大 DataFrame 或许多组它很慢:

df1 = (df.groupby('Category')     
        .apply(lambda x: (x['Weight (oz.)'] * x['Quantity']).sum()).reset_index(name='wsum'))

我不知道为什么它会起作用。Pandas 究竟将什么传递给匿名函数?它总是首先是数据框本身,然后是列的名称(如果指定)?

我认为原因应该是 pandas 映射 lambda 变量,因此df映射到每个组,a映射到 stringWeight (oz.)bstring Quantity

print(df.groupby('Category').apply(lambda df,a,b: print (df), 'Weight (oz.)', 'Quantity'))
print(df.groupby('Category').apply(lambda df,a,b: print (a), 'Weight (oz.)', 'Quantity'))
print(df.groupby('Category').apply(lambda df,a,b: print (b), 'Weight (oz.)', 'Quantity'))

但这确实不是 pandas 在函数中传递列名的标准方式。


推荐阅读