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
相关产品推荐
相关产品推荐

