熊猫,应用函数和lambda

时间:2017-03-08 22:22:57

标签: python pandas dataframe

在下面的pandas代码中,为什么参数中不需要df

df.groupby('Category').apply(lambda df,a,b: sum(df[a] * df[b]), 'Weight (oz.)', 'Quantity')

3 个答案:

答案 0 :(得分:1)

第一个参数隐式传递给apply调用中的函数。因此,它不再出现在args中。您实际上可以在apply to

中重写匿名函数
 df.groupby('Category').apply(lambda x: sum(x["Weight (oz.)"] * x["Quantity"]))

根本没有使用args。很明显,x是第一个在没有显式传递的情况下传递的参数。

答案 1 :(得分:0)

更一般地说,apply是DataFrame实例df的一种方法。

这归结为apply意味着隐含地传递了一个self参数。想象一下这个电话是apply(self, *args)

此处self指的是DataFrame实例df;所以现在应该很清楚,再次传递df将是多余的(如果允许的话)。

答案 2 :(得分:0)

在某种程度上相关且值得一提的是,您根本不需要apply,并且可以通过仅对您感兴趣的两列产品进行分组来大大加快操作速度。 您的'Category'列,例如

(df['Weight (oz.)'] * df['Quantity']).groupby(df.Category).sum()

示例

df = pd.DataFrame(dict(category=[1, 1, 1, 2, 2, 2, 3, 3, 3]*(10**6), 
                       a = np.random.randint(1, 10, 9*(10**6)), 
                       b=np.random.randint(1, 10, 9*(10**6))))

%timeit (df.a*df.b).groupby(df.category).sum()
1 loop, best of 3: 560 ms per loop

%timeit df.groupby('category').apply(lambda x: sum(x.a*x.b))
1 loop, best of 3: 3.34 s per loop