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

