pandas合并两个CSV生成的DataFrame时仅返回第一个数据集问题排查
问题根因
- 合并规则缺失:
pd.merge()默认对两个DataFrame的全部同名列做内连接,你处理后的两个DataFrame无公共匹配列,自然匹配不到BGC的对应数据。 - BGC文件读取参数错误:你已确认BGC的CSV无表头,但代码中用了
header=0参数,会把第一行数据误识别为表头,导致所有列索引、数据读取全部错位。 - 语法错误:删除多列的写法
data1.columns[1, 3, 5]非法,多位置索引需要嵌套方括号,正确写法为data1.columns[[1, 3, 5]]。 - 无关联匹配字段:两个数据集都未保留/新增统一的「期限」字段(比如RUB 1yr、RUB 2yr这类标识),无法按业务需求的期限做对应匹配。
- 废弃方法使用:pandas 2.0及以上版本已移除
append方法,会直接触发报错,建议替换为pd.concat。
修复后完整代码
import pandas as pd # 处理Tradition数据源 tradition_df = pd.read_csv('C:\\Users\\atul.sanwal\\Desktop\\Tradition_Basis_RFR_2021_12_05_15_00_00.csv', header=0, skiprows=1, nrows=22) tradition_df = tradition_df.drop(columns=["0"]) tradition_df['Mid_TRAD'] = tradition_df['Bid']/2 + tradition_df['Ask']/2 # 替换append为concat tradition_df = pd.concat([tradition_df.iloc[12:17, :], tradition_df.iloc[18:, :]], ignore_index=True) tradition_df = tradition_df.drop(columns=['Date', 'Time']) # 新增期限列,对应需求的9个期限 tradition_df['term'] = ['RUB 1yr', 'RUB 2yr', 'RUB 3yr', 'RUB 4yr', 'RUB 5yr', 'RUB 7yr', 'RUB 8yr', 'RUB 9yr', 'RUB 10yr'] # 处理BGC数据源,无表头所以header=None bgc_df = pd.read_csv('C:\\Users\\atul.sanwal\\Desktop\\BGC_RUB_2021_12_05_15_00_00.csv', header=None, skiprows=1, nrows=111) bgc_df = bgc_df.drop(columns=[0]) # 按位置取Bid和Ask列计算Mid bgc_df['Mid_BGC'] = bgc_df[2]/2 + bgc_df[4]/2 # 替换append为concat bgc_df = pd.concat([bgc_df.iloc[97:98, :], bgc_df.iloc[105:, :]], ignore_index=True) # 修正多列删除语法 bgc_df = bgc_df.drop(bgc_df.columns[[1, 3, 5]], axis=1) # 新增和Tradition对齐的期限列 bgc_df['term'] = ['RUB 1yr', 'RUB 2yr', 'RUB 3yr', 'RUB 4yr', 'RUB 5yr', 'RUB 7yr', 'RUB 8yr', 'RUB 9yr', 'RUB 10yr'] # 只保留关联键和需要的Mid列 bgc_df = bgc_df[['term', 'Mid_BGC']] # 指定用term列作为关联键,左连接保留Tradition全部期限数据 result = pd.merge(tradition_df, bgc_df, on='term', how='left') print(result)
关键修改说明
- 读取BGC文件时指定
header=None,避免把数据行当成表头 - 两个DataFrame都新增统一的
term字段作为关联键,和需求的9个期限一一对应 - 合并时指定
on='term'和左连接规则,确保两个来源的同期限数据匹配 - 修复了多列删除的语法错误,替换了已废弃的
append方法
内容的提问来源于stack exchange,提问作者Rahul Vaidya
相关产品推荐
相关产品推荐

