pandas.DataFrame.apply(func, axis=0):Apply a func
along an axis
of the DataFrame.
pandas.DataFrame.transform(func, axis=0):Call func
on self producing a DataFrame with transformed values. Produced DataFrame will have same axis length as self.
# 假设有如下数据
df = pd.DataFrame({'s':['s1', 's1', 's2', 's2', 's2', 's2', 's4', 's4', 's4'],
'm':['m1', 'm1', 'm3', 'm3', 'm4', 'm4', 'm2', 'm2', 'm2'],
'values':['a', 'n', 'cb', 'mk', 'bg', 'dg', 'rr', 'cb', '1'],
'number':[3, 2, 5, 8, 10, 1, 2, 2, 7]})
第一个不同:.transform
无法进行聚合,而.apply
则不一定:
df.groupby('s')['number'].apply(max)
# 结果如下
s
s1 3
s2 10
s4 7
Name: number, dtype: int64
df.groupby('s')['number'].transform(max)
# 结果如下
0 3
1 3
2 10
3 10
4 10
5 10
6 7
7 7
8 7
Name: number, dtype: int64
引申:所以
.transform
可以这样使用(但.apply
不行)df[df.groupby('s')['number'].transform(max) ==df['number']] # 结果如下 s m values number 0 s1 m1 a 3 4 s2 m4 bg 10 8 s4 m2 1 7
第二个不同:.apply
允许对dataframe的多个series进行操作,而.transform
只能如上所述搞一个:
def zidingyi(df):
return df['values'] + df['number'].astype('str')
df.groupby(['s']).apply(zidingyi)
# 结果如下
s
s1 0 a3
1 n2
s2 2 cb5
3 mk8
4 bg10
5 dg1
s4 6 rr2
7 cb2
8 17
dtype: object
df.groupby(['s']).transform(zidingyi)
# 结果如下
<blabla>...
KeyError: 'values'