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

Pandas无法基于子串过滤数据:TypeError报错问题求助

解决Pandas过滤含指定子串行的报错问题

问题场景

原始数据集:

company_url         Name                  Revenue
mackter.com         Mack Sander           NaN
nientact.com        Neient Dan            321
ventienty.com       Richard               NaN

需求:移除所有company_url或Name列中包含'tac'、'bux'或'mvy'子串的行(例如nientact.com包含'tac',该行需删除)。

尝试的错误代码:

lists=['tac', 'bux', 'mvy']
for i in lists:
    df = df[~df['company_url].str.contains(i)]

触发报错:TypeError: unhashable type: 'list'

错误原因

首先代码存在低级笔误:df['company_url]少了一个闭合的单引号,正确写法是df['company_url']。另外循环逐个子串过滤的方式不仅效率低,还容易因中间数据修改引发逻辑问题,更简洁可靠的方式是用正则表达式一次性匹配所有目标子串。

正确解决方案

直接用str.contains结合正则表达式,一次性完成多子串匹配,同时处理两列的过滤逻辑:

import pandas as pd

# 构造原始数据(已有DataFrame可跳过此步骤)
data = {
    'company_url': ['mackter.com', 'nientact.com', 'ventienty.com'],
    'Name': ['Mack Sander', 'Neient Dan', 'Richard'],
    'Revenue': [pd.NA, 321, pd.NA]
}
df = pd.DataFrame(data)

# 定义需要过滤的子串列表
filter_substrings = ['tac', 'bux', 'mvy']
# 用|拼接成正则匹配模式,匹配任意一个目标子串
match_pattern = '|'.join(filter_substrings)

# 执行过滤:保留两列都不包含目标子串的行
# case=False 忽略大小写(不需要可删除),na=False 把NaN值视为不匹配,避免报错
filtered_df = df[~(
    df['company_url'].str.contains(match_pattern, case=False, na=False) |
    df['Name'].str.contains(match_pattern, case=False, na=False)
)]

print(filtered_df)

运行结果:

company_url         Name Revenue
0    mackter.com  Mack Sander    <NA>
2  ventienty.com      Richard    <NA>

关键说明

  • '|'.join(filter_substrings)把多个子串拼成tac|bux|mvy,正则中|表示“或”,可匹配任意一个目标子串
  • ~符号用于取反,保留不符合过滤条件的行
  • na=False参数避免因列中存在NaN值触发报错,将NaN视为不包含目标子串

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:38:33