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

如何在Pandas中移除full_name包含part_name的行?

解决Pandas中按行判断字符串包含关系并过滤行的问题

问题原因

你之前的代码报错TypeError: unhashable type: 'Series',是因为pd.Series.str.contains()的第一个参数pat要求传入单个字符串或正则表达式,而你直接传入了整个part_name列(Series类型),不符合参数要求。

解决方案

要实现逐行检查part_name是否包含在full_name中,并过滤掉符合条件的行,可以用以下两种方法:

方法1:使用apply逐行处理

这是最直观的方式,通过apply遍历每一行进行判断:

import pandas as pd

df = pd.DataFrame({'city_code':['34', '36', '89', '34'], 
                   'full_name': ['WXYZ(24)', 'ZYXW', 'YZWX','WXYZ(24)'], 
                   'part_name': ['WXYZ', 'ABCD', 'YZWX', 'ABCD']})

# 生成过滤掩码:part_name不在full_name中的行保留
mask = df.apply(lambda row: row['part_name'] not in row['full_name'], axis=1)
df_filtered = df[mask]
print(df_filtered)

方法2:使用列表推导式(性能更优)

对于大数据集,列表推导式的运行效率比apply更高:

import pandas as pd

df = pd.DataFrame({'city_code':['34', '36', '89', '34'], 
                   'full_name': ['WXYZ(24)', 'ZYXW', 'YZWX','WXYZ(24)'], 
                   'part_name': ['WXYZ', 'ABCD', 'YZWX', 'ABCD']})

# 逐行判断并生成掩码
mask = [part not in full for full, part in zip(df['full_name'], df['part_name'])]
df_filtered = df[mask]
print(df_filtered)

输出结果

两种方法都会得到你期望的结果:

city_code   full_name part_name
1        36        ZYXW      ABCD
3        34  WXYZ(24)      ABCD

扩展:支持正则匹配

如果你的part_name包含正则特殊字符(如*、.、+),需要按正则规则匹配,可以修改apply的逻辑:

mask = df.apply(lambda row: not row['full_name'].str.contains(row['part_name'], regex=True), axis=1)
df_filtered = df[mask]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:57:20