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

如何基于列表值筛选含分隔符的DataFrame目标列数据?

pandas处理多值分隔列的筛选方案

你用df1.filter(~df1.goal.isin(li))没得到预期结果,核心原因是isin()做的是整字符串精确匹配——只有当goal列的内容和列表li里的元素完全一致时才会被匹配。像g3/g1这种斜杠分隔的多值字符串,和li里的单个值都不匹配,所以~isin会试图保留这条,但如果你的实际数据里没有完全不在li中的单值/多值,就会返回空表。

下面是针对不同筛选需求的可行方法:

需求1:保留goal中至少包含一个li内值的记录

方法1:正则匹配快速筛选

直接用str.contains生成匹配列表元素的正则模式,适合简单场景:

import pandas as pd

li = ['g1','g2','g3']
df1 = pd.DataFrame({
    'id': [1,2,3],
    'name': ['raj','harsh','ramu'],
    'goal': ['g1','g3/g1','g1']
})

# 生成匹配任意li元素的正则表达式
pattern = '|'.join(li)
# 筛选出包含至少一个目标值的记录
filtered_df = df1[df1['goal'].str.contains(pattern)]

方法2:拆分后精确匹配(避免误匹配)

如果需要严格匹配拆分后的每个值(比如防止g11被误判为g1),可以拆分列后展开判断:

# 拆分goal为列表,展开成多行后检查是否在li中
split_matches = df1.assign(goal_split=df1['goal'].str.split('/')).explode('goal_split')
# 按原行分组,只要有一个匹配就保留该行
keep_rows = split_matches['goal_split'].isin(li).groupby(level=0).any()
filtered_df = df1[keep_rows]

需求2:排除所有包含li内值的记录(原语句的预期逻辑)

只需要把上面的条件取反即可:

# 方法1取反
filtered_df = df1[~df1['goal'].str.contains(pattern)]

# 方法2取反
filtered_df = df1[~keep_rows]

需求3:仅保留goal中所有值都不在li内的记录

如果要筛选那些拆分后没有任何一个值在li里的记录:

# 按原行分组,所有值都不匹配才保留
exclude_all_rows = split_matches['goal_split'].isin(li).groupby(level=0).all()
filtered_df = df1[~exclude_all_rows]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:44:16