如何基于列表值筛选含分隔符的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
相关产品推荐
相关产品推荐

