我有一个类似的数据框
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
如果v
增加1,我想将i
列中的值与下一列相加。
可以假设最多有两个连续的行要累加,因此最后一行可能是不明确的,具体取决于是否累加。
结果数据框应如下所示:
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
的各种组合,尽管我看不出这样做的方法...
答案 0 :(得分:2)
这是识别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
答案 1 :(得分:2)
让我们尝试
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