如何用特征列表过滤含字符串描述列的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
相关产品推荐
相关产品推荐

