You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas如何按条件正确合并两个DataFrame:基于im_id的合并问题

原有代码的问题

  1. 合并连接类型错误:pandas.merge默认使用how='inner'(内连接),仅保留两个表im_id字段的交集行,所以im_df里独有的记录、dd_df里独有的记录都会被直接丢弃,这是你最终结果行数远小于预期的核心原因。
  2. 合并逻辑不符合需求:内连接的结果本身就缺了两部分你需要的记录,后续的列过滤、去重操作都无法补回被丢弃的行。

正确实现方式

根据你提到的两种需求场景,对应实现如下:

场景1:取im_id并集(规则:保留im_df所有行+dd_df独有的行,同im_id优先取im_df的字段值)

对应你最开始描述的合并规则,示例中im_id最终输出1、2、3、5、6的效果可以用以下代码实现:

# 先做外连接取im_id的并集,同名列加后缀区分来源
merged = im_df.merge(dd_df, on='im_id', how='outer', suffixes=('_im', '_dd'))

# 同名列优先取im_df的值,im_df为空的部分用dd_df的值填充
for col in im_df.columns:
    if col != 'im_id':
        merged[col] = merged[f'{col}_im'].combine_first(merged[f'{col}_dd'])

# 保留所有正式列,丢弃带后缀的中间列
merged = merged[im_df.columns.union(dd_df.columns)]

# 按需删除不需要的列、去重
merged = merged.drop(columns=["some_col_from_im_df_we_dont_need", "and_another"])
merged = merged.drop_duplicates(subset='im_id')

场景2:仅保留im_df全量行,拼接dd_df的额外字段

对应你后面给出的具体示例需求,只需要保留im_df的1、5两个im_id,同时补充evo列的话,用左连接即可:

# 左连接保留im_df所有行,匹配dd_df的额外字段
merged = im_df.merge(dd_df[['im_id', 'evo']], on='im_id', how='left')

# 按需删列、去重
merged = merged.drop(columns=["some_col_from_im_df_we_dont_need", "and_another"])
merged = merged.drop_duplicates(subset='im_id')

内容的提问来源于stack exchange,提问作者caasswa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:54:04