【问题标题】:Python: sum values of the third column if two columns have the same valuePython:如果两列具有相同的值,则对第三列的值求和
【发布时间】:2017-04-14 01:55:20
【问题描述】:

我有以下数据框df

df
    a   b   i
0   1.0 3.0 2.0
1   1.0 3.0 3.0
2   1.0 3.0 1.0
3   1.0 3.0 3.0
4   1.0 3.0 7.0
5   1.0 3.0 8.0
6   1.0 4.0 4.0
7   1.0 4.0 0.0
8   1.0 3.0 2.0
9   1.0 3.0 1.0
10  1.0 3.0 2.0

我想为同一对夫妇ab 求和,所以

df2
    a   b   i
0   1.0 3.0 31.0
1   1.0 4.0 4.0
2   1.0 3.0 0.0

df2 = df2.groupby(['a', 'b']).sum(['i']).reset_index()

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    我认为您需要在groupby 的末尾添加列i,然后它用于sum 功能:

    df2 = df2.groupby(['a', 'b'])['i'].sum().reset_index()
    print (df2)
         a    b     i
    0  1.0  3.0  29.0
    1  1.0  4.0   4.0
    

    或者添加参数as_index=False返回df

    df2 = df2.groupby(['a', 'b'], as_index=False)['i'].sum()
    print (df2)
         a    b     i
    0  1.0  3.0  29.0
    1  1.0  4.0   4.0
    

    如有必要,另一种解决方案是使用Series:

    df2 = df2.i.groupby([df2.a,df2.b]).sum().reset_index()
    print (df2)
         a    b     i
    0  1.0  3.0  29.0
    1  1.0  4.0   4.0
    

    编辑:

    如果需要在df 中按位置区分组,请使用groupby by Series gaggregate

    ab = df2[['a','b']]
    
    #compare shifted values    
    print (ab.ne(ab.shift()))
            a      b
    0    True   True
    1   False  False
    2   False  False
    3   False  False
    4   False  False
    5   False  False
    6   False   True
    7   False  False
    8   False   True
    9   False  False
    10  False  False
    
    #check at least one True
    print (ab.ne(ab.shift()).any(1))
    0      True
    1     False
    2     False
    3     False
    4     False
    5     False
    6      True
    7     False
    8      True
    9     False
    10    False
    dtype: bool
    
    #use cumulative sum of boolean Series
    g = ab.ne(ab.shift()).any(1).cumsum()
    print (g)
    0     1
    1     1
    2     1
    3     1
    4     1
    5     1
    6     2
    7     2
    8     3
    9     3
    10    3
    dtype: int32
    
    print (df2.groupby(g).agg(dict(a='first', b='first', i='sum')))
         a    b     i
    1  1.0  3.0  24.0
    2  1.0  4.0   4.0
    3  1.0  3.0   5.0
    

    【讨论】:

      【解决方案2】:

      你想比较一下之前的a, b组合是否发生了变化,并做一个cumsum来建立一个分组数组

      ab = df[['a', 'b']].apply(tuple, 1)
      
      df.groupby(ab.ne(ab.shift()).cumsum()) \
        .agg(dict(a='last', b='last', i='sum')) \
        .reindex_axis(df.columns.tolist(), 1)
      


      分解

      • ab = df[['a', 'b']].apply(tuple, 1)
        • 给我一系列元组,这样我就可以看到组合是否改变了
      • ab.ne(ab.shift())
        • 检查元组是否与前一个元组不同
      • ab.ne(ab.shift()).cumsum()
        • 如果不是,则将True 值添加到累积和中。这将为每组相同的ab 对创建一个方便的分组
      • .agg(dict(a='last', b='last', i='sum'))
        • 只是指定如何处理每组中的每一列。获取ab 的最后一个值,这很好,因为我知道它在整个组中都是一样的。在列上求和 i
      • .reindex_axis(df.columns.tolist(), 1)
        • 按照原来的方式获取我的列顺序

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-22
        • 2013-09-06
        • 1970-01-01
        • 2020-04-16
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多