python - 多个 pandas 组的条件求和,每个组由一组重叠的列值定义
问题描述
我正在尝试对由任意列值列表定义的行组执行条件求和。条件总和是指仅当第二列中的值高于阈值时才对一列中的值求和。组之间可以有重叠,并且每组中的元素数量可以不同。
例如,给定以下数据框:
data = {
'id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'counter': [10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
'output': [5, 10, 15, 20, 25, 35, 20, 15, 10, 5]
}
df = pd.DataFrame(data)
>>> df
id counter output
0 1 10 5
1 2 9 10
2 3 8 15
3 4 7 20
4 5 6 25
5 6 5 35
6 7 4 20
7 8 3 15
8 9 2 10
9 10 1 5
以及以下输入(如果我们需要更改它们的格式,我很灵活):
group_ids = {'Group A': [1, 2, 3, 4], 'Group B': [6, 7, 8, 9], 'Group C': [4, 5, 6]}
output_threshold = 12
我想生成以下新数据框,它是仅当超出指定counter
的列表定义的每个组的总和。如果我可以将标题添加到每个组中,则可以加分:group_ids
output
output_threshold
title sum
Group A 15
Group B 12
Group C 18
解决方案
您可以使用isin
检查值和总和:
mask = (df['output'] > output_threshold).astype(int)
for k,v in group_ids.items():
df[k] = df['id'].isin(v) * mask * df['counter']
df[group_ids.keys()].sum()
输出(不能完全符合您的预期):
Group A 15
Group B 12
Group C 18
dtype: int64
推荐阅读
- chirp - 找不到适用于 Windows UWP 的 ChirpConnectNative
- python-3.x - Celery Logging UnicodeDecodeError 使用“ascii”卡住
- docker - 码头工人。为容器设置公共 ip
- azure-resource-manager - Microsoft.DBforMySQL/servers arm 部署上的 OperationTimedOut
- php - Laravel 分离文件夹 Frontend 和 Backend
- java - 从共享点获取元数据(列信息)
- r - 如何修复 downloadHanler 中的“flextable 中的错误:col_keys 无效,flextable 仅支持语法名称”
- c++ - 强枚举 typedef:clang 错误或 c++11 标准不确定性?
- javascript - 给与页面 URL 具有相同 href-link 的锚元素一个带有 jQuery 的类
- google-cloud-platform - Google Compute Engine 是否会重新启动或关闭您的虚拟机?