对行进行部分分组[Python] [Pandas]

ecbunoof  于 2023-03-04  发布在  Python
关注(0)|答案(1)|浏览(132)

0
大家早上好。
我有以下数据:

import pandas as pd

info = {
'states': [-1, -1, -1, 1, 1, -1, 0, 1, 1, 1],
'values': [34, 29, 28, 30, 35, 33, 33, 36, 40, 41] }

df = pd.DataFrame(data=info)

print(df)

>>> 
    states   values
0       -1       34
1       -1       29
2       -1       28
3        1       30
4        1       35
5       -1       33
6        0       33
7        1       36
8        1       40
9        1       41

我需要使用PANDAS**(和/或高阶函数)对数据**进行分组(* 已经使用for循环做过练习 *),我需要以“状态”列为指南对数据进行分组。但分组不应包括所有数据,我只需要对相邻的数据进行分组......如下所示:
初始数据框:

states   values
0       -1       34 ┐
1       -1       29 │    Group this part (states = -1)
2       -1       28 ┘
3        1       30 ┐    Group this part (states =  1)
4        1       35 ┘
5       -1       33     'Group' this part (states = -1)
6        0       33     'Group' this part (states =  0)
7        1       36 ┐
8        1       40 │    Group this part (states =  1)
9        1       41 ┘

它将生成一个DataFrame,其中包含按段分组的内容(来自“states”列),另一列包含数据的总和(来自“values”列)。
预期 Dataframe :

states   values
0       -1       91     (values=34+29+28)
1        1       65     (values=30+35)
2       -1       33
3        0       33
4        1       117    (values=36+40+41)

你们谁比较精通这些问题,也许你们可以帮我做这个手术。
"太感谢你了"

mcdcgff0

mcdcgff01#

使用diffcumsum标识数据块/行组,然后按这些数据块对 Dataframe 进行分组,并聚合statesfirst以及valuessum

b = df['states'].diff().ne(0).cumsum()
df.groupby(b).agg({'states': 'first', 'values': 'sum'})

结果

states  values
states                
1           -1      91
2            1      65
3           -1      33
4            0      33
5            1     117

相关问题