当列具有连续数字时,仅对连续的行求和

  • 本文关键字:连续 求和 数字 python pandas
  • 更新时间 :
  • 英文 :


我有一个类似的数据帧

pd.DataFrame({'i': [ 3,  4, 12, 25, 44, 45, 52, 53, 65, 66]
, 't': range(1,11) 
, 'v': range(0,100)[::10]}
)

i   t   v
0   3   1   0
1   4   2   10
2   12  3   20
3   25  4   30
4   44  5   40
5   45  6   50
6   52  7   60
7   53  8   70
8   65  9   80
9   66  10  90

如果i增加1,我想将列v中的值与下一列相加,否则不执行任何操作。可以假设最多有两个连续的行要求和,因此最后一行可能是不明确的,这取决于它是否求和。

生成的数据帧应该看起来像:

i   t   v
0   3   1   10
2   12  3   20
3   25  4   30
4   44  5   90
6   52  7   130
8   65  9   170

显然,我可以使用.iterrows()对数据帧进行循环,但必须有一个更智能的解决方案。我尝试了shiftdiffgroupby的各种组合,但我看不到方法…

在diff:上用cumsum识别块是一种常见的技术

blocks = df['i'].diff().ne(1).cumsum()
df.groupby(blocks, as_index=False).agg({'i':'first','t':'first', 'v':'sum'})

输出:

i  t    v
0   3  1   10
1  12  3   20
2  25  4   30
3  44  5   90
4  52  7  130
5  65  9  170

让我们试试

out = df.groupby(df['i'].diff().ne(1).cumsum()).agg({'i':'first','t':'first','v':'sum'})
Out[11]: 
i  t    v
i            
1   3  1   10
2  12  3   20
3  25  4   30
4  44  5   90
5  52  7  130
6  65  9  170

最新更新