如何实现DataFrame字符串列匹配列表元素(包含匹配)并返回整行?
解决DataFrame列包含列表任意元素的匹配问题
你遇到的问题很典型:isin()方法是检查整个字符串是否完全等于列表中的某一项,所以只能匹配到索引3和4(这两行的x列正好是列表里的完整元素)。要实现“包含任意列表元素”的匹配,我们可以用两种常用方法:
方法1:使用str.contains结合正则表达式(推荐,性能更优)
pandas的str.contains支持正则表达式,我们可以把列表元素拼接成“或”模式的正则串,这样就能匹配包含任意元素的行。同时为了避免特殊字符干扰,建议用re.escape转义每个输入的元素:
import pandas as pd import re def filter_Industries(): num_of_industries = int(input('How many industries would you like to filter by?\n')) list_industries = [] for _ in range(num_of_industries): industry = input("Enter the industry:\n").strip() # 去除输入前后空格 list_industries.append(re.escape(industry)) # 转义正则特殊字符 return list_industries # 获取用户输入的列表 a = filter_Industries() # 拼接成正则匹配模式(元素间用|分隔,表示“或”) match_pattern = '|'.join(a) # 筛选包含任意元素的行,case=False可选(关闭大小写敏感) new_DF = df[df['x'].str.contains(match_pattern, case=False)]
方法2:使用apply结合any(更直观,适合小数据集)
如果你对正则不太熟悉,可以用apply遍历每一行,检查列表中是否有任意元素存在于当前字符串中:
import pandas as pd def filter_Industries(): num_of_industries = int(input('How many industries would you like to filter by?\n')) list_industries = [] for _ in range(num_of_industries): industry = input("Enter the industry:\n").strip() list_industries.append(industry) return list_industries a = filter_Industries() # 用lambda表达式检查每个字符串是否包含列表中的任意元素 new_DF = df[df['x'].apply(lambda s: any(industry in s for industry in a))]
额外优化建议
为了避免大小写、空格导致的匹配失败,可以统一处理输入和DataFrame的字符串:
# 处理输入:转小写+去空格 industry = input("Enter the industry:\n").strip().lower() # 处理DataFrame列:转小写+去空格 df['x'] = df['x'].str.strip().str.lower()
用这两种方法处理你给出的示例DataFrame,都会返回索引0、2、3、4的行,符合你的预期。
内容的提问来源于stack exchange,提问作者Smalik713
相关产品推荐
相关产品推荐

