Python技术问询:匹配df1证券与df2新闻标题并添加对应Ticker
解决方案
1. 为df2添加对应Tickers列
利用pandas的矢量化操作替代循环,高效匹配新闻标题与证券名称:
import pandas as pd # 构建证券名称到代码的映射字典 security_ticker_map = df1.set_index('Security')['Tickers'].to_dict() # 生成匹配完整证券名称的正则表达式(\b确保匹配完整单词,避免部分匹配) pattern = r'\b(' + '|'.join(security_ticker_map.keys()) + r')\b' # 提取标题中的证券名称,映射为对应代码 df2['Tickers'] = df2['headlines'].str.extract(pattern, expand=False).map(security_ticker_map)
如果新闻标题中没有匹配到任何df1里的证券,Tickers列对应值会显示NaN。
2. 删除df1中未在df2标题出现的行
先筛选出所有在新闻标题中出现过的证券,再过滤df1:
# 提取df2中所有匹配到的唯一证券名称 matched_securities = df2['headlines'].str.extractall(pattern)[0].unique() # 保留df1中出现过的证券行 df1_filtered = df1[df1['Security'].isin(matched_securities)]
原代码的问题说明
- 循环逻辑错误:按索引一一对应匹配df1和df2的行,而非遍历所有证券去匹配每条新闻;
- 效率极低:循环处理30k行新闻+500条证券,远不如pandas矢量化操作高效;
- 赋值错误:
df2["Tickers"] = df1["Tickers"][i]会把整列赋值为同一个值,而非对应行的代码; - 变量未定义:
data.drop(...)中的data未声明,且逻辑不符合需求(无需删除df2行,而是过滤df1)。
内容的提问来源于stack exchange,提问作者Giando
相关产品推荐
相关产品推荐

