首页 > 解决方案 > 使用熊猫,我如何对布尔列为真的求和案例进行分组/聚合?

问题描述

我有一个从数据库查询构造的 DataFrame。框架中的每一行都有一个数据库 ID、日期、工作、一个问题布尔值和一个固定布尔值。例如:

data = [
    {'id': 1, 'date': '2020-02-01', 'job': 'ABC', 'issue': True, 'fixed': False},
    {'id': 2, 'date': '2020-02-01', 'job': 'ABC', 'issue': False, 'fixed': False},
    {'id': 3, 'date': '2020-02-01', 'job': 'ABC', 'issue': True, 'fixed': True},
    {'id': 4, 'date': '2020-02-01', 'job': 'DEF', 'issue': True, 'fixed': True}
]
data_df = pd.DataFrame(data)

我想做一个我按工作groupbyagg日期分组的地方,并获得“问题”和“已修复”的数量为真。就像是:

result_data = [
    {'date': '2020-02-01', 'job': 'ABC', 'issue': 2, 'fixed': 1},
    {'date': '2020-02-01', 'job': 'DEF', 'issue': 1, 'fixed': 1}
]
result_df = pd.DataFrame(result_data)

代码看起来像:

result_df = data_df.groupby(['date', 'job']).agg({'issue': 'sum-true', 'fixed': 'sum-true'})

但我不确定'sum-true'应该是什么。不,我不能只通过列为真过滤整个 DF,并求和,issue可能是Truefixed而是False

标签: pythonpandasaggregatepandas-groupby

解决方案


这个怎么样?

>>> df.groupby(['date', 'job'])[['issue', 'fixed']].sum()
                issue  fixed
date       job              
2020-02-01 ABC    2.0    1.0
           DEF    1.0    1.0

简单地对布尔向量求和将返回True计数。

如果您想要上面指定的确切格式的数据,只需reset_index

>>> df.groupby(['date', 'job'])[['issue', 'fixed']].sum().reset_index()
         date  job  issue  fixed
0  2020-02-01  ABC    2.0    1.0
1  2020-02-01  DEF    1.0    1.0

推荐阅读