Python 序列上的部分和
我有一个Python 序列上的部分和,python,pandas,group-by,sum,Python,Pandas,Group By,Sum,我有一个数据帧,看起来像 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 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
的组是否相邻。使用助手系列
和聚合首先
和总和
:
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
详细信息:
将d列与(!=
)进行比较,并为连续组添加系列
:
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发表评论:
当数据类型为float时,检查是否相等可能会导致不需要的结果。np.isclose可能是一个更好的选择
itertools.groupby
遭受同样的问题
当数据类型为float时,检查是否相等可能会导致不需要的结果
np.isclose
在这里可能是一个更好的选择。难道你不能通过将df.a
转换为Categorical来避免np.isclose
吗?@jpp-在我看来,如果a
列中有少量的唯一值,这应该很好。
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]
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