python - 在 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
我想做的事:
- 按“A”分组
- 按 C == True 的组选择值 B
- 计算此选择的平均值
- 创建一个新列“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")
但是这些语法都不起作用。
感谢您帮助我和一般人,
解决方案
Series.map
与mean
s 的过滤行一起使用,==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
推荐阅读
- angular - ngIf 仅在 ngFor 中的一个部分列出
- node.js - 为后端 API 编写通用包装 API
- html - 如何将表格中的数字向左对齐?
- node.js - PUG vs HTML,在Node.JS中将数据渲染到视图页面哪个更好(快递)
- sql - 创建一个触发器以获取登录时间和注销时间,并为 SQL 投入工作时间
- matplotlib - 有没有办法将内部字符串或标识符或标签分配给 matplotlib 艺术家?
- c# - ContentPresenter 中的 Xamarin 表单绑定
- arrays - 无法从数组中删除对象而不弄乱它
- ant-media-server - 如何将我的所有配置和内容从 Enterprise Antmedia 版本迁移到另一个 Enterprise Antmedia?
- google-bigquery - 文件中的转义字符