You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效筛选出DataFrame中无±1配对的ID?

筛选无配对ID的高效方法

针对你给出的DataFrame场景(配对ID为相差±1的数值,如4330和4331为一对),以下是两种高效的筛选无配对ID的方法:

方法一:集合+向量化查询(推荐,无排序需求)

利用集合的O(1)查询特性,结合pandas的向量化操作,直接判断每个ID的±1是否存在于ID列中:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'ID': [4330, 4331, 2333, 2334, 3336, 3337, 3349],
    'sex': [2]*7,
    'zyg': [2]*7,
    'race': [2,2,1,1,1,1,1],
    'SES': [1,1,78,78,18,18,18]
})

# 将ID转为集合,加快查询速度
id_set = set(df['ID'])
# 筛选出既没有ID+1也没有ID-1的行
unpaired_df = df[~((df['ID'] + 1).isin(id_set) | (df['ID'] - 1).isin(id_set))]
print(unpaired_df)

运行结果会直接返回ID为3349的行,这种方法不需要排序,时间复杂度接近O(n),处理大数据量时效率更高。

方法二:排序后检查相邻行

如果ID本身可以排序,也可以通过检查前后行的ID差值来判断:

# 先按ID排序
sorted_df = df.sort_values('ID')
# 判断当前ID是否有前一个配对(差值为1)或后一个配对(差值为-1)
has_prev_pair = sorted_df['ID'].diff() == 1
has_next_pair = sorted_df['ID'].diff(-1) == -1
# 筛选无配对的行
unpaired_df = sorted_df[~(has_prev_pair | has_next_pair)]
print(unpaired_df)

这种方法的核心是排序后通过diff()快速判断相邻关系,适合ID原本就有序的场景,时间复杂度主要由排序的O(n log n)决定。

内容的提问来源于stack exchange,提问作者wooden05

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:10:39