Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 序列上的部分和_Python_Pandas_Group By_Sum - Fatal编程技术网

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