如何匹配6个DataFrame的[Col A]对应[Col B]得分并生成新DataFrame
多参数国家得分表对齐合并方案
不要使用iloc按行位置匹配、或写多层循环条件判断实现需求:这类方案完全依赖各表的国家行顺序完全一致,只要某张表缺一个国家、或者排序不同,就会出现整列数据错位,且数据量稍大时运行效率极低。使用pandas自带的键匹配合并逻辑即可高效、准确完成需求,具体实现路径如下:
前置预处理
先对6个独立参数表做统一列名处理,避免合并时列名冲突,同时统一匹配键:
- 所有表的
Col A(国家名列)统一重命名为相同字段名,比如国家名称 - 每个表的
Col B(得分列)重命名为对应参数的专属名称,比如军事表改为军事得分、人口表改为人口得分,其余4个表按参数类型同理修改
参考预处理代码:
# 逐表完成重命名,示例为军事、人口两个表的处理逻辑 df_military = df_military.rename(columns={"Col A": "国家名称", "Col B": "军事得分"}) df_population = df_population.rename(columns={"Col A": "国家名称", "Col B": "人口得分"}) # 经济、科技、外交、资源等其余4个表按相同规则重命名即可
核心合并操作
选择外连接(outer join) 逻辑做匹配,可以保留所有参数表中出现过的全部国家,某张表未收录的国家对应得分会自动填充为空值NaN,完全不会出现匹配错位问题,两种实现方式任选其一即可:
方法1:逐表merge(适合表量少的场景,6张表用这个逻辑直观易调试)
df_final = df_military.merge( df_population, on="国家名称", how="outer" ).merge( df_economy, on="国家名称", how="outer" ).merge( df_tech, on="国家名称", how="outer" ).merge( df_diplomacy, on="国家名称", how="outer" ).merge( df_resource, on="国家名称", how="outer" )
方法2:concat按索引拼接(写法更简洁)
先将所有表的匹配键设为索引,再做横向拼接,pandas会自动按索引值(国家名)对齐数据:
# 将所有预处理完成的参数表存入列表 df_list = [df_military, df_population, df_economy, df_tech, df_diplomacy, df_resource] # 统一设置国家名为索引后横向拼接,最后将国家名转回普通列 df_final = pd.concat( [df.set_index("国家名称") for df in df_list], axis=1, join="outer" ).reset_index()
结果校验
合并完成后可做两步简单校验,确保匹配准确:
- 执行
print(df_final["国家名称"].duplicated().sum()),返回值为0即说明没有重复匹配的国家条目;如果返回值大于0,需要检查原表是否存在同一国家多行录入的问题 - 缺失值可按分析需求处理:如果需要将未收录的得分记为0,可执行
df_final = df_final.fillna(0);如果需要保留缺失标记,直接保留NaN即可。
内容的提问来源于stack exchange,提问作者intellgirl
相关产品推荐
相关产品推荐

