python - 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 究竟将什么传递给匿名函数?它总是首先是数据框本身,然后是列的名称(如果指定)?
如果您能帮助我理解这一点,我将不胜感激
解决方案
我认为您首先需要多个列,然后再聚合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.)
和b
string 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 在函数中传递列名的标准方式。
推荐阅读
- php - Symfony 服务容器 - 使用带有参数的工厂作为参数
- git - 即使在 git fetch 之后,在 bitbucket 中创建的分支也不会显示在我的本地 git 中
- firebase - 在 Vue 中,如何链接到包含用户特定数据的组件?
- git - git subtree add 后 Git push to main project repo 抛出错误
- perl - 珀尔;在多个文件中查找并替换为特殊条件字符串
- go - Serf 客户端无法连接到本地运行的 RPC 客户端
- python - 使用 Zeep (Python) 的 SOAP 请求“引发 XMLParseError: Unexpected element”
- json - 在 python 中使用 json.loads 读取日志文件时出错
- java - 使用其他班级的 NFC 活动
- node.js - 升级项目以使用更高版本的 NodeJS?