如何高效筛选出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
相关产品推荐
相关产品推荐

