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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:22:54