【问题标题】:Pandas: Group by two columns to get sum of another columnPandas:按两列分组以获得另一列的总和
【发布时间】:2017-03-25 23:31:58
【问题描述】:

我查看了大多数以前提出的问题,但无法找到我的问题的答案:

我有以下data.frame

           id   year month score num_attempts
0      483625  2010    01   50      1
1      967799  2009    03   50      1
2      213473  2005    09  100      1
3      498110  2010    12   60      1
5      187243  2010    01  100      1
6      508311  2005    10   15      1
7      486688  2005    10   50      1
8      212550  2005    10  500      1
10     136701  2005    09   25      1
11     471651  2010    01   50      1

我想得到以下数据框

year month sum_score sum_num_attempts
2009    03   50           1
2005    09  125           2
2010    12   60           1
2010    01  200           2
2005    10  565           3

这是我尝试过的:

sum_df = df.groupby(by=['year','month'])['score'].sum()

但这看起来并不高效和正确。如果我有多个列需要聚合,这似乎是一个非常昂贵的调用。例如,如果我有另一列 num_attempts 并且只想按年月求和作为分数。

【问题讨论】:

  • 您能否详细说明为什么您认为这是一个广泛的呼叫,以及如果您想将num_attempts 保留在群组操作中,您会如何处理它?
  • @MaxU 不确定我是否理解 `as_index=False 的用法,它有什么作用?
  • 很抱歉我的第一条评论 - 我误解了你。有什么问题:df.groupby(['year','month'])[['score','num_attempts']].sum() 或 df.groupby(['year','month']).agg({'score':'sum', 'num_attempts':'max'})?
  • @MaxU 如果我想在不同的列中反映结果,这将在结果数据框中创建新列,我可以这样做。我的数据框也很大。这是执行此任务的最佳方式吗?
  • @Boud 我在这个数据框中有近 900 万条记录,似乎需要很长时间才能得到结果,但我还没有看到最后一帧。

标签: pandas group-by


【解决方案1】:

这应该是一种有效的方式:

sum_df = df.groupby(['year','month']).agg({'score': 'sum', 'num_attempts': 'sum'})

【讨论】:

  • score 列是否必须是明确的整数?
  • @Null-Hypothesis 我不这么认为。如果不起作用,您能详细说明吗?
  • 生成的 sum_df 仅包含求和列。
  • 如果有人还想重命名创建的列,以便新的(分数)列与输入列不使用相同的名称。在末尾追加.rename(columns={'score': 'score_sum_by_year_month'})。
【解决方案2】:

根据 Dennis 的解决方案,这应该会导致包含所需列的 df:

sum = df.groupby(["year", "month"]).agg({"score": "sum", "num_attempts": "sum"}).reset_index()

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    相关资源
    最近更新 更多