首页 > 解决方案 > 多个 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_idsoutputoutput_threshold

title    sum
Group A   15
Group B   12
Group C   18

标签: pythonpandas

解决方案


您可以使用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

推荐阅读