我有一个类似的数据帧
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()
对数据帧进行循环,但必须有一个更智能的解决方案。我尝试了shift
、diff
和groupby
的各种组合,但我看不到方法…
在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