【问题标题】:Using pandas, how can I group/aggregate summing cases where boolean columns are true?使用熊猫,我如何对布尔列为真的求和案例进行分组/聚合?
【发布时间】:2020-06-06 06:30:20
【问题描述】:

我有一个从数据库查询构造的 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 可能是 True,而 fixedFalse

【问题讨论】:

    标签: python pandas aggregate pandas-groupby


    【解决方案1】:

    这个怎么样?

    >>> 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
    

    【讨论】:

    • 这能保证在所有情况下都有效吗?我可以发誓我早先尝试过这个确切的代码,它返回 1.0(如果有 1 个或更多)或 0.0(如果没有 True 值)。当然,运行您发布的代码效果很好。我需要弄清楚我之前在做什么不同。
    • @MarkD,您描述的情况似乎您可能一直在使用.max() 进行聚合(但我怀疑情况确实如此)。也许这是来自该数据库查询的issuefixed 字段类型的问题?我不知道,也许该字段由于某种原因在数据库中存储为字符串,并且没有在 pandas 中转换为布尔值。
    • 不幸的是,如果没有更完整的代表性数据集,很难知道。
    • 会显式调用agg(如我上面的示例)会改变什么吗?我刚刚意识到我还需要计算每个条目的总数。所以类似于:.agg({'issue': ['sum', 'count'], 'fixed': ['sum']}) 最终,我试图(从一个大型数据库表)获取每个工作/日期的问题数量和已修复问题的数量。 (注意——我刚刚发布的 agg 调用似乎运行良好。我只是担心几分钟前它似乎没有运行)
    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2020-07-05
    • 1970-01-01
    • 2016-07-20
    • 2020-04-18
    • 1970-01-01
    相关资源
    最近更新 更多