在pandas documentation关于GroupBy对象的新.pipe()
方法的示例中,接受相同lambda的.apply()
方法将返回相同的结果。
In [195]: import numpy as np
In [196]: n = 1000
In [197]: df = pd.DataFrame({'Store': np.random.choice(['Store_1', 'Store_2'], n),
.....: 'Product': np.random.choice(['Product_1', 'Product_2', 'Product_3'], n),
.....: 'Revenue': (np.random.random(n)*50+10).round(2),
.....: 'Quantity': np.random.randint(1, 10, size=n)})
In [199]: (df.groupby(['Store', 'Product'])
.....: .pipe(lambda grp: grp.Revenue.sum()/grp.Quantity.sum())
.....: .unstack().round(2))
Out[199]:
Product Product_1 Product_2 Product_3
Store
Store_1 6.93 6.82 7.15
Store_2 6.69 6.64 6.77
我可以看到pipe
功能与DataFrame对象的apply
有何不同,但不是GroupBy对象的apply
。有没有人能解释或举例说明用pipe
而不是用apply
来处理GroupBy?
pipe
所做的是允许您传递一个可调用的对象,期望调用pipe
的对象是传递给可调用的对象。对于
apply
,我们假设调用apply
的对象具有子组件,每个子组件都将传递给传递给apply
的可调用对象。在groupby
的上下文中,子组件是名为groupby
的数据帧的片段,其中每个片段都是数据帧本身。这类似于序列groupby
。使用
groupby
上下文中的pipe
所能做的主要区别在于,您对groupby
对象的整个可调用范围都是可用的。对于apply,您只知道本地切片。设置 考虑
df
示例1
使整个
'B'
列的总和为1
,而每个子组的总和为相同的量。这要求计算时知道存在多少组。这是我们不能用apply
做的,因为apply
不知道有多少组存在。注:
以及:
示例2
从另一组的值中减去一组的平均值。同样,这不能用
apply
完成,因为apply
不知道其他组。相关问题 更多 >
编程相关推荐