如何过滤next列所有值均不匹配ID列的Pandas DataFrame行
Pandas多值列过滤:筛选next列所有值均不在ID列中的行
原始数据与需求
初始DataFrame代码
import pandas as pd data = { "ID": [420, 380, 390, 540, 520, 50, 22], "duration": [50, 40, 45,33,19,1,3], "next":["390;50","880;222" ,"520;50" ,"380;111" ,"810;111" ,"22;888" ,"11" ] } df = pd.DataFrame(data)
需求说明
ID列为整数类型,next列是分号分隔的数字字符串。需要过滤出next列中所有值均不存在于ID列的行,预期输出:
ID duration next 1 380 40 880;222 4 520 19 810;111 6 22 3 11
现有问题
此前处理单值场景时使用df[~df.next.astype(int).isin(df.ID)],但该方法无法处理next列包含多个值的情况。
解决方案
实现代码
# 把ID列转为集合,提升成员查询效率 id_set = set(df['ID']) # 生成过滤掩码:检查next列拆分后的所有数字都不在ID集合中 mask = df['next'].apply(lambda x: all(int(num) not in id_set for num in x.split(';'))) # 过滤得到结果 result = df[mask] print(result)
代码解释
- 转集合优化查询:将ID列转为集合
id_set,集合的成员查询时间复杂度为O(1),远快于列表的O(n),处理大量数据时优势明显。 - 拆分与校验:对next列的每个字符串用
split(';')拆分,将每个子串转为整数后,用all()判断所有数字是否都不在id_set中——只有全部满足条件的行才会被标记为True。 - 过滤DataFrame:用生成的布尔掩码
mask过滤原DataFrame,直接得到符合需求的结果。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

