如何在Pandas中为groupby聚合函数应用filter?
我有数据框
data = {'Fruit':['apple', 'apple', 'apple', 'kivi', 'kivi', 'kivi'],
'Y_or_N': ['Y', 'N', 'Y', 'N', 'N', 'Y'],
'A_or_B': ['A', 'A', 'B', 'A', 'B', 'A'],
'Number': [3, 5, 6, 7, 2, 4]}
df = pd.DataFrame.from_dict(data)
我想为每个水果组总和数值在3列:(1)所有值,(2)其中“Y_或_N”==“Y”,(3)其中“A_或_B”==“A”。
我尝试了以下方法:
new_df = df.groupby(['Fruit']).apply(lambda x: x[x['Y_or_N'] == 'Y' ].agg(sum_Y=('Number', 'sum')))
这是可行的,但只适用于1列。有没有更有效的方法对不同的列和聚合函数应用不同的过滤器?而不需要制作3个df然后将它们合并在一起。
预期输出:
| 水果|总和|总和_Y|总和_A|
| - ------|- ------|- ------|- ------|
| 苹果|十四|九|八个|
| 基维|十三|四个|十一|
4条答案
按热度按时间tp5buhyn1#
我将首先修改列,然后进行聚合:
输出:
0md85ypi2#
rkkpypqq3#
pd.pivot
的另一个选项:v7pvogib4#
以下是您可以做到这一点的三种方法:
第一种方式:
第二条路:
方法#3:这是@mozway给出的最佳答案的变体,并进行了以下调整:
Number
列访问分解为Series,我们将其管道化为lambdaconvert_dtypes
返回int,以获取筛选列的总和,其中NaN导致向上转换浮动输出: