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

如何用特征列表过滤含字符串描述列的DataFrame?

解决DataFrame多特征字符串过滤问题

你有一个包含长字符串的description列的DataFrame,手动编写多个str.contains的或条件能得到正确结果,但尝试用特征列表循环实现时返回空DataFrame,需要更简洁的实现方式。

手动有效代码:

filter_df = df.loc[(((df['description'].str.contains('estudio', case=False, regex=True, na=False)) | (df['description'].str.contains('family', case=False, regex=True, na=False))) | (df['description'].str.contains('family room', case=False, regex=True, na=False))) | (df['description'].str.contains('estar familiar', case=False, regex=True, na=False))]

特征列表:

feature_list = [ 'Estudio' , 'Family room' , 'Estar familiar' , 'Walking Closet' , 'Walk-in Closet' ,'Walk in closet' , 'Walkin closet' , 'Walkin clóset' , 'Walk in Clóset', 'Walk-in Clóset', 'Walking Clóset']

错误原因分析

你之前的代码存在以下问题:

  • 循环中每次重新赋值filter_df,仅保留当前特征的过滤结果,未合并所有符合条件的行;
  • 参考方案未返回过滤后的DataFrame,且未添加na=False参数,导致NaN值干扰条件判断;
  • 未处理特征中的正则特殊字符(如Walk-in中的-),可能导致匹配失效。

解决方案

方法一:正则表达式合并特征(高效推荐)

利用str.contains支持正则的特性,将所有特征转义后用|拼接,一次完成所有特征的匹配:

import re
import pandas as pd

feature_list = [ 'Estudio' , 'Family room' , 'Estar familiar' , 'Walking Closet' , 'Walk-in Closet' ,'Walk in closet' , 'Walkin closet' , 'Walkin clóset' , 'Walk in Clóset', 'Walk-in Clóset', 'Walking Clóset']

# 转义每个特征,避免正则特殊字符干扰,拼接成OR逻辑的正则表达式
pattern = '|'.join(re.escape(f) for f in feature_list)

# 执行过滤,参数与手动代码保持一致
filter_df = df.loc[df['description'].str.contains(pattern, case=False, regex=True, na=False)]

方法二:循环构建布尔条件(兼容复杂场景)

初始化全False的布尔序列,循环累加匹配条件:

import pandas as pd

feature_list = [ 'Estudio' , 'Family room' , 'Estar familiar' , 'Walking Closet' , 'Walk-in Closet' ,'Walk in closet' , 'Walkin closet' , 'Walkin clóset' , 'Walk in Clóset', 'Walk-in Clóset', 'Walking Clóset']

# 初始化与DataFrame长度一致的全False条件序列
conditions = pd.Series([False] * len(df), index=df.index)

for f in feature_list:
    # 累加匹配条件,用|=实现逻辑或
    conditions |= df['description'].str.contains(f, case=False, regex=True, na=False)

# 过滤得到结果
filter_df = df.loc[conditions]

说明

  • re.escape用于处理特征中的正则特殊字符(如-、.等),确保按字面量匹配;
  • na=False参数将NaN值视为不匹配,避免干扰过滤结果;
  • 方法一仅需一次字符串匹配,性能优于循环多次匹配,适合大数据量场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:46:01