【问题标题】:Python, pandas, cumulative sum in new column on matching groupsPython,pandas,匹配组新列中的累积总和
【发布时间】:2017-01-05 15:27:23
【问题描述】:

如果我在数据框中有这些列:

a     b  
1     5   
1     7
2     3
1,2   3
2     5

如何创建列c,其中列b 使用列a(字符串)的分组求和,保留现有数据框。有些行可以属于多个组。

a     b     c
1     5     15
1     7     15
2     3     11
1,2   3     26
2     5     11

由于我拥有的数据框非常大,有没有简单有效的解决方案。

【问题讨论】:

    标签: python pandas dataframe group-by sum


    【解决方案1】:

    您可以先将ajoin 列拆分为原始DataFrame

    print (df.a.str.split(',', expand=True)
                   .stack()
                   .reset_index(level=1, drop=True)
                   .rename('a'))
    0    1
    1    1
    2    2
    3    1
    3    2
    4    2
    Name: a, dtype: object
    
    df1 = df.drop('a', axis=1)
            .join(df.a.str.split(',', expand=True)
                          .stack()
                          .reset_index(level=1, drop=True)
                          .rename('a'))
    print (df1)
       b  a
    0  5  1
    1  7  1
    2  3  2
    3  3  1
    3  3  2
    4  5  2
    

    然后将transform 用于sum 而不加修饰。

    df1['c'] = df1.groupby(['a'])['b'].transform(sum)
    #cast for aggreagation join working with strings
    df1['a'] = df1.a.astype(str)
    print (df1)
       b  a   c
    0  5  1  15
    1  7  1  15
    2  3  2  11
    3  3  1  15
    3  3  2  11
    4  5  2  11
    

    最后groupby 按索引和聚合列按agg

    print (df1.groupby(level=0)
              .agg({'a':','.join,'b':'first' ,'c':sum})
              [['a','b','c']] )
    
         a  b   c
    0    1  5  15
    1    1  7  15
    2    2  3  11
    3  1,2  3  26
    4    2  5  11          
    

    【讨论】:

    猜你喜欢
    • 2018-05-30
    • 2014-07-13
    • 2019-02-15
    • 2021-10-28
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    相关资源
    最近更新 更多