我有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
的群组是否彼此相邻。
答案 0 :(得分:6)
使用汇总Series
和first
的帮助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
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