Pandas合并股票日度价格与VADER日度情感得分时出现值缺失、索引类型不匹配报错问题
核心问题定位
你合并后出现整列NaN的核心原因和concat参数设置无关,本质是两个基础问题:
- 两边的Date索引类型根本不匹配:你之前写merge语句时报的
You are trying to merge on object and datetime64[ns] columns错已经明确提示了——至少有一个表的Date索引是字符串/普通对象类型,不是标准的datetime64时间格式。哪怕肉眼看日期字符串长得一模一样,pandas也会把它们判定为完全不同的索引值,根本没法匹配对应行,拼出来自然整列都是NaN。 - 情感得分的pivot表是双层列结构:现在pivot的列是从数据透视表出来的两层索引(第一层是聚合方式mean,第二层是指标compound),没有做扁平化处理,所以合并后你看到列名显示成元组形式的
(mean, compound),虽然这不是值缺失的核心原因,但后续取数、筛选的时候很容易因为列名层级不对报错。
分步解决操作
- 统一索引格式,消除匹配障碍
不管之前两个表的索引是什么格式,强制转成标准化的datetime64类型,从根源解决类型不匹配的问题:price_df.index = pd.to_datetime(price_df.index) pivot.index = pd.to_datetime(pivot.index) - 扁平化pivot表的多层列索引
把两层的列结构拍平成单层,设置直观的列名,避免元组形式的列名带来后续操作报错:# 将双层列名合并为单层,重命名为易懂的情感得分列名 pivot.columns = ['compound_sentiment'] - 执行合并操作
索引类型统一后,不管用concat还是merge都能正常匹配行:# 按列合并,可根据需求选择连接方式: # join='inner':仅保留两个表共有的日期(即所有有股价的交易日) # join='outer':保留两个表的全部日期(非交易日的股价列会自动填充NaN,属于正常现象) merged_df = pd.concat([price_df, pivot], axis=1, join='inner') # 如果习惯用merge语法,可以直接指定按索引匹配,不需要手动传on参数 merged_df = price_df.merge(pivot, left_index=True, right_index=True, how='inner')
补充说明:合并完成后,如果看到非交易日的股价列出现NaN属于正常业务现象:股票交易仅在工作日开市,周末、节假日没有交易数据,而Twitter推文是每日都有采集,因此非交易日的复权收盘价天然不存在值,不需要特意填充。
内容的提问来源于stack exchange,提问作者user15503241
相关产品推荐
相关产品推荐

