我有这个数据框:
id start end
1 1 2
1 13 27
1 30 35
1 36 40
2 2 5
2 8 10
2 25 30
例如,我想对ID行进行分组并汇总n-1行的end
与n行的start
之差小于10的行。我已经找到了使用循环的方法,但是它过长,超过一百万行。
所以预期结果将是:
id start end
1 1 2
1 13 40
2 2 10
2 25 30
首先,我可以使用df['diff']=df['start'].shift(-1)-df['end']
获得所需的差异。如何根据每个不同ID的条件收集ID?
谢谢!
答案 0 :(得分:1)
我相信您可以通过将end
和10
乘以g = df['start'].sub(df.groupby('id')['end'].shift()).gt(10).cumsum()
df = (df.groupby(['id',g])
.agg({'start':'first', 'end': 'last'})
.reset_index(level=1, drop=True)
.reset_index())
print (df)
id start end
0 1 1 2
1 1 13 40
2 2 2 10
3 2 25 30
并乘以DataFrameGroupBy.shift
并乘以GroupBy.agg
来创建分组。
<runtime>
<os>linux</os>
<javaVersion>11</javaVersion>
</runtime>