如何用Pandas为指定列匹配对应值且避免重复
Pandas匹配指定列数值且保留原表行数的解决方案
需求
使用Pandas为指定列的数值匹配对应值,且不产生重复数据,严格保留原左表的行数。
现有数据
df1
IN name1 size ttee date days new date year month AA1 dd 1 FALSE 1/14/2023 10 1/14/2023 2023 January AA1 ff 2 FALSE 1/9/2023 10 1/9/2023 2023 January AA1 jj 3 FALSE 1/8/2023 10 1/8/2023 2023 January AA1 mm 4 FALSE 1/9/2023 10 1/9/2023 2023 January AA1 nn 5 FALSE 1/29/2023 10 1/29/2023 2023 January
df2
name stat year month AA1 KZZ:1 2022 January AA1 KZZ:1 2023 April AA1 KZZ:1 2023 March AA1 KZZ:1 2022 February AA1 KZZ:1 2022 April AA1 KZZ:1 2022 September AA1 KZZ:1 2022 February AA1 KZZ:1 2022 March AA1 KZZ:1 2023 June AA1 KZZ:1 2022 December AA1 KZZ:1 2022 January AA1 KZZ:1 2022 January
期望结果
IN name1 size ttee date days new date year month stat AA1 dd 1 FALSE 1/14/2023 10 1/14/2023 2023 January KZZ:1 AA1 ff 2 FALSE 1/9/2023 10 1/9/2023 2023 January KZZ:1 AA1 jj 3 FALSE 1/8/2023 10 1/8/2023 2023 January KZZ:1 AA1 mm 4 FALSE 1/9/2023 10 1/9/2023 2023 January KZZ:1 AA1 nn 5 FALSE 1/29/2023 10 1/29/2023 2023 January KZZ:1
尝试代码及问题
尝试代码:
out = pd.merge(df1,df2.drop_duplicates(), left_on=['IN'], right_on= ['name'], how="left")
问题:执行后生成了膨胀的组合结果,未保留原左表行数。原因是df2.drop_duplicates()仅去除完全重复的行,但仍存在多个name=AA1的不同行(因year和month字段不同),左连接时每个df1的行都会与这些行一一匹配,导致行数倍增。
解决方法
核心思路是先构建name与stat的唯一映射表,确保每个name仅对应一行数据,再进行合并:
- 从df2中提取
name和stat的唯一组合,生成映射表:
# 提取并去重,得到name与stat的唯一对应关系 df2_mapping = df2[['name', 'stat']].drop_duplicates()
- 使用映射表与df1进行左连接,保留原表行数:
# 执行合并 out = pd.merge(df1, df2_mapping, left_on=['IN'], right_on=['name'], how='left') # 移除多余的name列(可选操作) out = out.drop(columns=['name'])
执行上述代码后,即可得到与期望结果一致的输出,既完成了stat值的匹配,又严格保留了原左表的行数,不会产生重复数据。
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

