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开始,一个新的组(即一个新的总和)也将从那里开始:)