【问题标题】:Pandas Groupby with bin sum aggregation [closed]具有 bin 总和聚合的 Pandas Groupby [关闭]
【发布时间】:2021-10-02 18:58:59
【问题描述】:

我有一个与this one 类似的问题

我在 pandas 中有一个如下所示的数据框 - 显示不同用户获奖的年龄。

id awards age
1 100 24
1 150 26
1 50 54
2 193 34
2 209 50

有兴趣计算年龄区间的总奖励,即 0(0-8 岁)、1(9-17 岁)、2(18-26 岁)、3(27-35 岁)、4( 26 - 44 岁)... 等等。每个人都应该有尽可能多的年龄间隔来满足最年长的人的需要

如何按 id 和 9 岁的年龄间隔对它们进行分组以获得类似的结果:

id. total_awards age_interval
1 0 0
1 0 1
1 250 2
1 0 3
1 0 4
1 0 5
1 50 6
2 0 0
2 0 1
2 0 2
2 193 3
2 0 4
2 209 5
2 0 6

【问题讨论】:

  • 能否将您的输入数据格式化为可执行代码?
  • 我的答案是否有任何问题,您必须选择另一个答案,其结果与您想要的输出不相似?让我知道,看看我是否可以对其进行微调。
  • 感谢您再次做出明智的选择。

标签: python pandas


【解决方案1】:

您可以按如下方式定义 bin 和 cut:

bins = [9 * i for i in range(0, df['age'].max() // 9 + 2)]
cuts = pd.cut(df['age'], bins, right=False)

print(cuts)

0    [18, 27)
1    [18, 27)
2    [54, 63)
3    [27, 36)
4    [45, 54)
Name: age, dtype: category
Categories (7, interval[int64, left]): [[0, 9) < [9, 18) < [18, 27) < [27, 36) < [36, 45) < [45, 54) < [54, 63)]

然后,按idcuts 分组,然后将awards 相加得到total_awards。通过GroupBy.cumcount()创建age_interval

df_out = (df.groupby(['id', cuts])
            .agg(total_awards=('awards', 'sum'))
            .reset_index(level=0)
            .reset_index(drop=True)
         )
df_out['age_interval'] = df_out.groupby('id').cumcount()

结果:

print(df_out)

    id  total_awards  age_interval
0    1             0             0
1    1             0             1
2    1           250             2
3    1             0             3
4    1             0             4
5    1             0             5
6    1            50             6
7    2             0             0
8    2             0             1
9    2             0             2
10   2           193             3
11   2             0             4
12   2           209             5
13   2             0             6

【讨论】:

    【解决方案2】:

    很确定这涵盖了您正在寻找的内容

    df = pd.read_clipboard()
    bins = [i for i in range(0, 100 ,9)]
    results = df.groupby(['id', pd.cut(df.age, bins)])['awards'].sum().reset_index()
    print(results)
    
        id  age         awards
    0   1   (0, 9]      NaN
    1   1   (9, 18]     NaN
    2   1   (18, 27]    250.0
    3   1   (27, 36]    NaN
    4   1   (36, 45]    NaN
    5   1   (45, 54]    50.0
    6   1   (54, 63]    NaN
    7   1   (63, 72]    NaN
    8   1   (72, 81]    NaN
    9   1   (81, 90]    NaN
    10  1   (90, 99]    NaN
    11  2   (0, 9]      NaN
    12  2   (9, 18]     NaN
    13  2   (18, 27]    NaN
    14  2   (27, 36]    193.0
    15  2   (36, 45]    NaN
    16  2   (45, 54]    209.0
    17  2   (54, 63]    NaN
    18  2   (63, 72]    NaN
    19  2   (72, 81]    NaN
    20  2   (81, 90]    NaN
    21  2   (90, 99]    NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2018-09-29
      • 2020-01-28
      • 2021-11-01
      • 2021-11-20
      相关资源
      最近更新 更多