如何基于列名合并pandas DataFrame并匹配对应ticker的sector信息
pandas 不同索引DataFrame合并解决方案
1. 修复df2列名报错问题
你之前执行set_index('Index')触发列不存在报错,是因为Excel导入时没有正确识别表头,df2的列名被默认设为了0、1、2这类自动生成的数字。首先修正df2结构:
- 先执行
print(df2.head())确认结构:如果df2第一行是字段说明(第一列值为ticker、第二列值为sector),执行以下代码重置列名:
# 将第一行数据设为列名 df2.columns = df2.iloc[0] # 移除已经用作列名的第一行,重置索引 df2 = df2[1:].reset_index(drop=True)
- 修正后执行
print(df2.columns.tolist()),确认输出中包含ticker和sector两个列名即可。
2. 合并生成目标df3
不要直接用concat,concat默认不会自动按ticker匹配对齐,会直接追加列。我们通过映射关系直接给df1新增sector行,会自动保留df1原有的列顺序和全部数据:
# 生成ticker到sector的映射字典 sector_map = df2.set_index('ticker')['sector'].to_dict() # 新增sector行,自动按df1的ticker列顺序匹配值 df1.loc['sector'] = df1.columns.map(sector_map) # 得到最终结果df3 df3 = df1.copy()
如果存在df1里的ticker在df2中没有对应sector的情况,默认会填充NaN,可按需填充默认值:
df3.loc['sector'] = df3.loc['sector'].fillna('未知板块')
3. 结果验证
执行print(df3.head())确认以下三点符合预期:
- 原有avg、std、min、max四行数据无任何改动
- 新增的sector行数值和对应ticker匹配正确
- 列顺序和原df1完全一致
内容的提问来源于stack exchange,提问作者heff
相关产品推荐
相关产品推荐

