文本列含指定经济术语,筛选后DataFrame为何为空?
问题描述
现有两个DataFrame:
df:包含一列文本数据(列名text)econ_terms:包含两列,分别存储正面(plus)和负面(minus)经济术语
目标是移除df中不包含任何正面/负面经济术语的文本行,编写的代码如下:
# Convert the column to a string df['text'] = df['text'].astype(str) econ_terms['plus'] = econ_terms['plus'].astype(str) econ_terms['minus'] = econ_terms['minus'].astype(str) # Get the unique values from 'plus' and 'minus' columns in the 'econ_terms' DataFrame econ_values = set(econ_terms['plus']).union(set(econ_terms['minus'])) # Filter the 'df' DataFrame using boolean indexing df_filtered = df[df['text'].isin(econ_values)]
手动确认:econ_terms的minus列包含“unemployment”,且df的text列确实存在包含该词汇的文本,但筛选后df_filtered是空DataFrame,需排查原因。
问题原因分析
- 完全匹配逻辑错误:
isin()是检查df['text']的整行文本是否完全等于经济术语集合中的某一个值,而非检查文本中是否包含该术语。比如df文本是“Rising unemployment rates”时,和“unemployment”不是完全相等的字符串,会被直接过滤。 - 大小写/空格差异:术语和文本中的词汇存在大小写不一致(如术语是“Unemployment”,文本是“unemployment”)、前后空格(术语带尾空格,文本不带)等情况时,完全匹配会失败。
- 特殊字符/空值干扰:转字符串时,原空值会变成
'nan'字符串;另外文本或术语中可能存在不可见特殊字符(全角空格、换行符),导致表面一致但实际匹配失败。
修正方案
改用包含检查逻辑替换完全匹配,结合str.contains()和正则实现:
# 转换为字符串类型 df['text'] = df['text'].astype(str) econ_terms['plus'] = econ_terms['plus'].astype(str) econ_terms['minus'] = econ_terms['minus'].astype(str) # 合并所有经济术语,生成正则匹配模式 econ_terms_list = econ_terms['plus'].tolist() + econ_terms['minus'].tolist() # 清理空字符串和多余空格,避免正则错误 econ_terms_list = [term.strip() for term in econ_terms_list if term.strip()] pattern = '|'.join(econ_terms_list) # 筛选包含任意经济术语的行,忽略大小写并排除空值 df_filtered = df[df['text'].str.contains(pattern, case=False, na=False)]
说明:
str.contains(pattern)会检查文本中是否包含任意指定术语,不再要求完全相等。case=False开启大小写不敏感匹配,避免因大小写差异漏判。na=False将空值行标记为不匹配,排除空值干扰。
内容的提问来源于stack exchange,提问作者datascientistxxx
相关产品推荐
相关产品推荐

