如何基于车牌尾号匹配DataFrame获取车型并保持行数一致?
解决方法:先构建唯一映射再关联
你的问题出在df_First里存在重复的Car Plate End行,直接用merge会触发笛卡尔积,导致结果出现重复行和多余列。要实现需求,我们需要先从df_First中提取车牌尾号与车型的唯一对应关系,再关联到df_Second上。
步骤1:构建唯一映射表
首先从df_First中筛选出不重复的Car Plate End和Car Model组合:
# 提取唯一的车牌-车型映射 unique_car_map = df_First[['Car Plate End', 'Car Model']].drop_duplicates()
这一步会把重复的Fiesta 2010行去掉,得到每个车牌尾号对应的唯一车型。
步骤2:关联到df_Second
使用left join(保留df_Second的所有行,匹配不到的填充NaN)进行合并:
df_Total = pd.merge(df_Second, unique_car_map, on='Car Plate End', how='left')
更简洁的替代方案:使用map
如果你觉得merge步骤麻烦,也可以先创建字典映射,再用map方法直接添加列:
# 创建车牌到车型的字典 model_dict = df_First.drop_duplicates('Car Plate End').set_index('Car Plate End')['Car Model'].to_dict() # 复制原df_Second并添加新列 df_Total = df_Second.copy() df_Total['Car Model'] = df_Total['Car Plate End'].map(model_dict)
验证结果
运行上述代码后,你会得到期望的输出:
Car Plate End Cost_Max Cost_Min Car Model 0 749 10 1 Fiesta 2010 1 749 20 2 Fiesta 2010 2 749 30 3 Fiesta 2010 3 100 40 4 Cruze 2020 4 749 50 5 Fiesta 2010 5 100 60 6 Cruze 2020 6 200 70 7 Fiesta 2005 7 500 80 8 NaN
为什么之前的merge(how='outer')不行?
df_First中同一Car Plate End有多行,merge时会对每一行进行匹配,导致结果出现大量重复行outer join会保留两个表的所有行,而你只需要保留df_Second的行,left join更合适- 原merge会带上
df_First的所有列(比如Car Color、Num Door),而我们只需要Car Model,所以先筛选列再合并就不会有多余列
内容的提问来源于stack exchange,提问作者Jane Borges
相关产品推荐
相关产品推荐

