Python Pandas-使用GroupBy重置的累积总和

Python Pandas-使用GroupBy重置的累积总和,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个几千时间序列的数据帧 每个时间序列由一个整数标识 对于每个时间序列,都有一个唯一的时间戳,因此我可以强制执行顺序 对于下面的示例,我将时间戳替换为整数idx 每个timeseries都有一个状态列 对于下面的示例,状态为0或1 但我计算得出,可以使用NaN或其他更简单的方法 在出现一定数量的连续1之前,我需要“放弃”所有行 它是30,但是对于下面的例子,我说2,以保持例子的简洁 所以,这里有一些样本数据 test = pd.DataFrame({ 'gro

我有一个几千时间序列的数据帧

  • 每个时间序列由一个整数标识

对于每个时间序列,都有一个唯一的时间戳,因此我可以强制执行顺序

  • 对于下面的示例,我将时间戳替换为整数idx

每个timeseries都有一个状态列

  • 对于下面的示例,状态为0或1
  • 但我计算得出,可以使用NaN或其他更简单的方法

在出现一定数量的连续1之前,我需要“放弃”所有行

  • 它是30,但是对于下面的例子,我说2,以保持例子的简洁

所以,这里有一些样本数据

test = pd.DataFrame({
    'group': [1,1,1,1,1,1,1, 2,2,2,2,2,2,2],
    'idx':   [0,1,2,3,4,5,6, 0,1,2,3,4,5,6],
    'value': [0,1,0,1,1,1,1, 0,1,1,1,0,1,0],
})
我想要的结果是

desired_result = pd.DataFrame({
    'group': [        1,1,1,     2,2,2,2,2],
    'idx':   [        4,5,6,     2,3,4,5,6],
    'value': [        1,1,1,     1,1,0,1,0],
})
我想我需要计算的是

test = pd.DataFrame({
    'group': [1,1,1,1,1,1,1, 2,2,2,2,2,2,2],
    'idx':   [0,1,2,3,4,5,6, 0,1,2,3,4,5,6],
    'value': [0,1,0,1,1,1,1, 0,1,1,1,0,1,0],
   #'consec':[0,1,0,1,2,3,4, 0,1,2,3,0,1,0], -- the cumulative sum of value, but resetting whenever a 0 is encountered
   #'max_c': [0,1,1,1,2,3,4, 0,1,2,3,3,3,3], -- the cumulative max of consec
   #                  ^ ^ ^      ^ ^ ^ ^ ^   -- rows I want to keep, as max_c >= 2
})
然后我可以只取
test[test['max\u c']>=2]


但是,如何计算连续性呢

  • 独立重置为0时的
    值的累积和



编辑:我的最佳尝试,但感觉冗长可笑

test['cumsum'] = test.groupby(['group'])['value'].cumsum()

test['reset'] = test['cumsum'][ test.groupby(['group'])['value'].diff() == -1 ]
test['reset'] = test['reset'].fillna(0)

test['reset_cummax'] = test.groupby(['group'])['reset'].cummax()

test['consec'] = test['cumsum'] - test['reset_cummax']

test['c_max'] = test.groupby(['group'])['consec'].cummax()

IIUC,您可以在列组上的
groupby
之后执行
cumsum
,每次列值
eq
为0时,您也可以使用
cumsum
创建一个新组

test['consec'] = test.groupby(['group', test['value'].eq(0).cumsum()])['value'].cumsum()
test['max_c'] = test.groupby(['group'])['consec'].cummax()
print(test)
    group  idx  value  consec  max_c
0       1    0      0       0      0
1       1    1      1       1      1
2       1    2      0       0      1
3       1    3      1       1      1
4       1    4      1       2      2
5       1    5      1       3      3
6       1    6      1       4      4
7       2    0      0       0      0
8       2    1      1       1      1
9       2    2      1       2      2
10      2    3      1       3      3
11      2    4      0       0      3
12      2    5      1       1      3
13      2    6      0       0      3

感觉像是
测试['value'].eq(0).cumsum()
应该有自己的
.groupby(['group'])
?或者,我是否过于偏执,因为即使它跨越了两个群体,这也无关紧要,因为它是已经包括了
群体的
groupby
的一部分?(我认为这是可行的,谢谢,只是向它射击一些其他测试数据)@MatBailie组将重新启动以获取组中的任何新值,因为
group
test['value'].eq(0).cumsum()
都在groupby中。因此,即使一个组以值1开始,一个新的组(即一个新的总和)也将从那里开始:)