Pandas如何按条件正确合并两个DataFrame:基于im_id的合并问题
原有代码的问题
- 合并连接类型错误:
pandas.merge默认使用how='inner'(内连接),仅保留两个表im_id字段的交集行,所以im_df里独有的记录、dd_df里独有的记录都会被直接丢弃,这是你最终结果行数远小于预期的核心原因。 - 合并逻辑不符合需求:内连接的结果本身就缺了两部分你需要的记录,后续的列过滤、去重操作都无法补回被丢弃的行。
正确实现方式
根据你提到的两种需求场景,对应实现如下:
场景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
相关产品推荐
相关产品推荐

