如何基于ticker和date键合并两个Pandas DataFrame,解决拼接报错和空值问题
Pandas 双关联键全量合并实现方案
问题根因说明
pd.concat(axis=1)是按行索引对齐拼接,不会主动匹配ticker和date字段,只要两个表行数一致就会硬拼,导致最终结果出现两个ticker列和两个date列,你用var['ticker']取到的是二维DataFrame,传入.loc判断自然会报多维键错误。- 直接用merge出现大量空值,大概率是两个原因:一是默认用了
how='inner'内连接,仅保留两边都匹配的记录;二是两个表的ticker、date字段格式不一致(比如一个是日期类型一个是字符串,ticker带多余空格等)导致关联不上。
实现步骤
1. 先统一关联键格式(避免隐性不匹配)
import pandas as pd # 统一两个表的date字段为datetime类型,消除字符串格式差异 financials_Balance_Sheet_yearly['date'] = pd.to_datetime(financials_Balance_Sheet_yearly['date']) financials_Income_Statement_yearly['date'] = pd.to_datetime(financials_Income_Statement_yearly['date']) # 统一ticker字段,去除首尾空格,避免隐性不匹配 financials_Balance_Sheet_yearly['ticker'] = financials_Balance_Sheet_yearly['ticker'].str.strip() financials_Income_Statement_yearly['ticker'] = financials_Income_Statement_yearly['ticker'].str.strip()
2. 用外连接实现全量保留合并
指定ticker和date为关联键,用how='outer'外连接保留两边所有记录,匹配不到的字段自动填充NaN,方便后续校验清洗:
merged_df = pd.merge( left=financials_Balance_Sheet_yearly, right=financials_Income_Statement_yearly, on=['ticker', 'date'], how='outer', suffixes=('_balance', '_income') # 非关联重名字段自动加后缀区分,避免覆盖 )
3. 筛选AAPL.US记录
aapl_data = merged_df.loc[merged_df['ticker'] == 'AAPL.US']
可选:不匹配记录校验
如果需要单独排查两边匹配不上的记录,可以用以下代码筛选:
# 仅在资产负债表中存在的记录 balance_only = merged_df[merged_df.filter(regex='_income$').isna().all(axis=1)] # 仅在利润表中存在的记录 income_only = merged_df[merged_df.filter(regex='_balance$').isna().all(axis=1)]
内容的提问来源于stack exchange,提问作者Lostsoul
相关产品推荐
相关产品推荐

