翻译:apply与transform在搭配groupby的不同

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'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值