Pandas:查找列中间隔50单位的连续数据项
搞定Pandas中连续区间的查找问题
嘿,我明白你的需求了——要按alt分组,找出那些start和end首尾衔接(刚好对应你说的50单位间隔区间)的连续数据项对吧?咱们一步步来实现:
第一步:先构造示例数据(方便你测试)
先把你给的示例数据转换成可操作的DataFrame:
import pandas as pd data = { 'alt': ['borderline', 'borderline', 'borderline', 'duplicated', 'borderline', 'borderline'], 'start': [6017254, 6017304, 6017354, 6018212, 6018262, 6018312], 'end': [6017304, 6017354, 6017404, 6018262, 6018312, 6018362] } df = pd.DataFrame(data)
第二步:标记连续的区间行
核心思路是:同一alt组内,如果当前行的start等于上一行的end,就说明这两行是连续的。我们用groupby结合shift()来做判断:
# 按alt分组,比较当前行start和前一行end是否相等 df['is_continuous'] = df.groupby('alt')['start'].shift() == df['end'].shift(1) # 每个组的第一行没有前一行,所以填充为False df['is_continuous'] = df['is_continuous'].fillna(False) # 给每个连续块生成唯一ID:每次遇到不连续的行,ID就加1 df['continuous_block'] = df.groupby('alt')['is_continuous'].cumsum().astype(int) # 把ID调整为从1开始,看着更直观 df['continuous_block'] = df.groupby('alt')['continuous_block'].transform(lambda x: x + 1)
现在查看df,同一连续块的行会有相同的continuous_block值——比如前3条borderline属于块1,最后两条borderline属于块2,单独的duplicated属于块1。
第三步:合并连续区间(可选)
如果想把连续的小区间合并成一个完整的大区间,直接分组聚合就行:
merged_continuous = df.groupby(['alt', 'continuous_block']).agg( start=('start', 'first'), # 取块内第一个起始值 end=('end', 'last'), # 取块内最后一个结束值 total_intervals=('start', 'count') # 统计这个块包含多少个小区间 ).reset_index()
运行后得到的结果会是这样:
| alt | continuous_block | start | end | total_intervals |
|---|---|---|---|---|
| borderline | 1 | 6017254 | 6017404 | 3 |
| borderline | 2 | 6018262 | 6018362 | 2 |
| duplicated | 1 | 6018212 | 6018262 | 1 |
第四步:筛选真正的连续块(可选)
如果你只想保留那些由多个连续小区间组成的块,过滤掉单个区间的就行:
only_continuous_blocks = merged_continuous[merged_continuous['total_intervals'] > 1]
这样就得到了所有符合你要求的连续数据块啦!
内容的提问来源于stack exchange,提问作者nuin
相关产品推荐
相关产品推荐

