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

如何过滤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:45:42