【问题标题】:How to apply an accumulative aggregation function with a group by on Pandas?如何在 Pandas 上通过 group by 应用累积聚合函数?
【发布时间】:2020-01-24 12:31:04
【问题描述】:

我有这个数据框

df1 = pd.DataFrame({'A': ['A0', 'A0', 'A1', 'A1','A0', 'A0', 'A1', 'A1', 'A0', 'A0', 'A1', 'A1'],
                        'B': [1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11],
                        'C': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
                        'i': [1, 1, 1, 1,2, 2, 2, 2, 3, 3, 3, 3]},
                      )

     A   B   C  i
0   A0   1   0  1
1   A0   2   1  1
2   A1   3   2  1
3   A1   3   3  1
4   A0   4   4  2
5   A0   5   5  2
6   A1   6   6  2
7   A1   7   7  2
8   A0   8   8  3
9   A0   9   9  3
10  A1  10  10  3
11  A1  11  11  3

我想按Ai 分组:

df1.set_index(['A', 'i'], inplace=True)
df1.groupby(df1.index).sum()

          B   C
(A0, 1)   3   1
(A0, 2)   9   9
(A0, 3)  17  17
(A1, 1)   6   5
(A1, 2)  13  13
(A1, 3)  21  21

但我希望(A0,2) 的结果是(A0,1)(A0,2) 的总和,而(A0,3)(A0,1)(A0,2)(A0,3) 的总和,与A1,我知道我可以通过循环来完成,但我正在寻找更好的解决方案,因为我的 DataFrame 比这个大。我想要的结果表是这个

          B   C
(A0, 1)   3   1
(A0, 2)  12  10
(A0, 3)  29  27
(A1, 1)   6   5
(A1, 2)  19  18
(A1, 3)  40  39

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-groupby


    【解决方案1】:

    使用Groupby.cumsum 而不使用df1.set_index(['A', 'i'], inplace=True)

    new_df = df1.groupby(['A','i']).sum().groupby(level = 0).cumsum()
    #not need set_index
    #df1.set_index(['A','i']).groupby(['A','i']).sum().groupby(level = 
    new_df.index = [*new_df.index] #for expected output
    print(new_df)
              B   C
    (A0, 1)   3   1
    (A0, 2)  12  10
    (A0, 3)  29  27
    (A1, 1)   6   5
    (A1, 2)  19  18
    (A1, 3)  40  39
    

    【讨论】:

    • 如何使用自制的聚合功能做同样的事情?我的意思是聚合函数不是总和的情况
    • 看具体情况,能不能再提一个问题?我很乐意为您提供帮助
    【解决方案2】:

    总结: 对列 B 和 C 使用 groupby 函数和聚合总和。下一步 - 第二次 groupby,仅使用列 A,并聚合列 B 和 C 的累积总和。聚合将 groupby 值减少到一个点。仅使用 A 列进行分组消除了限制并允许累积得到所需的结果。

     (df1.groupby(['A','i'])
    .agg({'B':'sum','C':'sum'})
    .groupby(['A'])['B','C'].agg('cumsum'))
    
                B   C
      A i       
     A0 1   3   1
        2   12  10
        3   29  27
    A1  1   6   5
        2   19  18
        3   40  39
    

    【讨论】:

    • 他不需要选择列,但是好吧,如果你想要选择列...为什么(df1.groupby(['A','i']) .agg({'B':'sum','C':'sum'})) 而不是df1.groupby(['A','i'])['B','C'].sum()?,为什么.agg('cumsum') 而不是.cumsum
    • 我想我明白你的意思。紧凑。感谢您的观察。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多