首页 > 解决方案 > 在 groupby 之后过滤行并应用函数

问题描述

我正在使用 python 和 pandas 处理一些数据。我的数据如下所示:

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                         'foo', 'bar'],
                   'B' : [1, 2, 3, 4, 5, 6],
                   'C' : [True, False, True, True, False, True]})
print(df)

     A  B      C
0  foo  1   True
1  bar  2  False
2  foo  3   True
3  bar  4   True
4  foo  5  False
5  bar  6   True

我想做的事:

  1. 按“A”分组
  2. 按 C == True 的组选择值 B
  3. 计算此选择的平均值
  4. 创建一个新列“D”来存储这些值

所以结果是:

    A   B   C       D
0   foo 1   True    2
1   bar 2   False   5
2   foo 3   True    2
3   bar 4   True    5
4   foo 5   False   2
5   bar 6   True    5

我尝试了一些 groupby、filter 和 transform 的组合,但我无法成功。我想的解决方案接近以下

df.groupby(["A"])[df.loc[df["C"] == True, "B"]].transform("mean")

或者

df.groupby(["A"]).filter(lambda x: x["D"] == True)["B"].transform("mean")

但是这些语法都不起作用。

感谢您帮助我和一般人,

标签: pythonpandaspandas-groupby

解决方案


Series.mapmeans 的过滤行一起使用,==True应省略:

df['D'] = df['A'].map(df.loc[df.C, 'B'].groupby(df["A"]).mean())
print(df)

     A  B      C  D
0  foo  1   True  2
1  bar  2  False  5
2  foo  3   True  2
3  bar  4   True  5
4  foo  5  False  2
5  bar  6   True  5

推荐阅读