大熊猫系列的部分总和

时间:2018-05-29 20:24:58

标签: python pandas group-by sum

我有DataFrame看起来像

       A      B
0     1.2     1
1     1.2     6
2     1.2     4
3     2.3     2
4     2.3     5
5     1.2     7

我希望获得与A共享相同值的组的部分总和,但前提是它们彼此相邻。对于这种情况,我希望在

中有另一个DataFrame
0    1.2    11
3    2.3    7
5    1.2    7

我觉得我可以使用.groupby,但我只能管理它,以便忽视A的群组是否彼此相邻。

2 个答案:

答案 0 :(得分:6)

使用汇总Seriesfirst的帮助sum groupby

df = df.groupby(df.A.ne(df.A.shift()).cumsum(), as_index=False).agg({'A':'first','B':'sum'})
print (df)
     A   B
0  1.2  11
1  2.3   7
2  1.2   7

<强>详细

shift d列与ne !=进行比较,并为连续组Series添加cumsum

print (df.A.ne(df.A.shift()).cumsum())
0    1
1    1
2    1
3    2
4    2
5    3
Name: A, dtype: int32

感谢@ user2285236的评论:

  

当dtype为float时,检查相等性可能会导致不需要的结果。 np.isclose可能是更好的选择

df = df.groupby(np.cumsum(~np.isclose(df.A, df.A.shift())), as_index=False).agg({'A':'first','B':'sum'})
print (df)
     A   B
0  1.2  11
1  2.3   7
2  1.2   7

print (np.cumsum(~np.isclose(df.A, df.A.shift())))
[1 1 1 2 2 3]

答案 1 :(得分:2)

itertools.groupby

遇到@user2285236

突出显示的同一问题
g = groupby(df.itertuples(index=False), key=lambda x: x.A)
pd.DataFrame(
    [[a, sum(t.B for t in b)] for a, b in g],
    columns=df.columns
)

     A   B
0  1.2  11
1  2.3   7
2  1.2   7