我有以下数据框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
我希望同一对i
和a
的总和超过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()
答案 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)
将其分解
ab = df[['a', 'b']].apply(tuple, 1)
ab.ne(ab.shift())
ab.ne(ab.shift()).cumsum()
True
值添加到累积总和。这将为每组a
和b
.agg(dict(a='last', b='last', i='sum'))
a
和b
的最后一个值,这很好,因为我知道整个组都是一样的。列i
.reindex_axis(df.columns.tolist(), 1)