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

ema*_*max 3 python group-by pandas

我有以下数据帧 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
Run Code Online (Sandbox Code Playgroud)

我要让总和超过i了同一对夫妇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()
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 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
Run Code Online (Sandbox Code Playgroud)

或添加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
Run Code Online (Sandbox Code Playgroud)

如有必要,另一种解决方案是使用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
Run Code Online (Sandbox Code Playgroud)

编辑:

如果需要群体的差异在位置df使用groupbySeries 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
Run Code Online (Sandbox Code Playgroud)
#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
Run Code Online (Sandbox Code Playgroud)
#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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)