看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Pandas groupby() 操作后的分组对象应用 apply 和 transform 方法时,经常会产生一些疑问,那么他们之间有哪些相同点,又有哪些不同点,本页将进行对比介绍。
从对函数的输入上:
输出的数据:
因此,transform 一次只对一个系列起作用,而 apply 一次对整个数据帧起作用。
检查传递给 apply 或 transform 的自定义函数的输入会有很大帮助。我们开始:
import pandas as pd
import numpy as np
df = pd.DataFrame({'State':['Texas', 'Texas', 'Florida', 'Florida'],
'a':[4,5,1,3], 'b':[6,10,3,11]})
'''
State a b
0 Texas 4 6
1 Texas 5 10
2 Florida 1 3
3 Florida 3 11
'''
让我们创建一个简单的自定义函数,它打印出隐式传递对象的类型,然后引发一个错误,以便停止执行。
def inspect(x):
print(type(x))
raise
现在,让我们将此函数传递给 groupby apply 和 transform 方法,以查看传递给它的对象:
df.groupby('State').apply(inspect)
'''
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
RuntimeError
'''
如您所见,数据帧被传递到 inspect 函数中。您可能想知道为什么 DataFrame 类型打印了两次,在第一组跑了两次。它这样做是为了确定是否有一种快速的方法来完成计算。这是一个你不应该担心的小细节。
现在,让我们对transform做同样的事情:
df.groupby('State').transform(inspect)
'''
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
RuntimeError
'''
它被传递一个序列,一个完全不同的对象。因此,变换一次只能处理单个序列。它不可能同时作用于两列。所以,如果我们尝试从自定义函数中的 b 中减去 a 列,我们将得到一个转换错误。见下文:
def subtract_two(x):
return x['a'] - x['b']
df.groupby('State').transform(subtract_two)
# KeyError: ('a', 'occurred at index a')
当 pandas 试图查找不存在的系列索引 a 时,我们得到一个 keyrerror。您可以使用 apply 完成此操作,因为它具有整个数据帧:
df.groupby('State').apply(subtract_two)
'''
State
Florida 2 -2
3 -8
Texas 0 -2
1 -5
dtype: int64
'''
输出是一个系列,由于保留了原始索引,所以有点混乱,但我们可以访问所有列。
更新时间:2022-01-22 14:40:15 标签:pandas apply transform groupby