Python:如果两列具有相同的值,则为第三列的和值

时间:2016-11-29 22:00:53

标签: python pandas group-by

我有以下数据框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

我希望同一对ia的总和超过b,所以

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()

2 个答案:

答案 0 :(得分:5)

我认为您需要在i的末尾添加列groupby,然后将其用于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使用Series g 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 aggregate一起使用{@ 1>},则需要区分不同的群组:

#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
java.nio.charset.Charset

答案 1 :(得分:1)

您要进行比较以查看之前的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)

enter image description here

将其分解

  • 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)
    • 按照
    • 的方式获取我的列顺序