Pandas如何筛选DataFrame中仅含指定列表独立单词的行
实现方案
核心用正则的单词边界符\b匹配独立词汇,即可避免子串命中的问题,同时支持忽略大小写匹配,不需要分开拼接大小写匹配结果,代码更简洁高效。
核心筛选逻辑
import re import pandas as pd names = ['ATH', 'CRSR', 'GME', 'AMC', 'TSLA', 'MVIS', 'SPCE', 'CLNE', 'AAPL', 'WKHS'] # 构造独立单词匹配正则,re.escape避免目标词含特殊正则字符导致匹配异常 match_pattern = '|'.join([rf'\b{re.escape(ticker)}\b' for ticker in names]) # 筛选文本包含任意独立目标词的行,case=False表示忽略大小写 df_filtered = df[df['text'].str.contains(match_pattern, case=False, regex=True)].copy()
匹配规则说明
\b是正则单词边界符,仅当目标词前后为非单词字符(空格、标点、换行、字符串首尾等)时才会命中,完美符合你的需求:
- 示例中
bloodbath里的ath前后都是字母,不属于单词边界,不会被命中,第29行直接被过滤 - 其余行的
ATH、ath、aapl都是独立单词,会被正常命中保留
完整修改后代码
import re import pandas as pd # 目标词汇列表 names = ['ATH', 'CRSR', 'GME', 'AMC', 'TSLA', 'MVIS', 'SPCE', 'CLNE', 'AAPL', 'WKHS'] # 构造匹配规则 match_pattern = '|'.join([rf'\b{re.escape(ticker)}\b' for ticker in names]) # 筛选符合要求的行,同时处理dt字段 df_ticker = df[df['text'].str.contains(match_pattern, case=False, regex=True)].copy() df_ticker['dt'] = pd.to_datetime(df_ticker['dt']) # 原有去重逻辑保留,无需修改 def dedup(sentence, to_dedup): for word in to_dedup: while sentence.split().count(word) > 3: sentence = ''.join(sentence.rsplit(word, 1)).replace(' ', ' ') return sentence df_ticker['text'] = df_ticker.apply(lambda row: dedup(row['text'], names), axis=1)
内容的提问来源于stack exchange,提问作者YanRemes
相关产品推荐
相关产品推荐

