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

合并不同大小DataFrame:将df1的x/y/z映射到df2的问题求助

问题:合并两个DataFrame并映射指定列,未匹配行填充0

我需要合并两个大小不同的DataFrame:

  • df1是较小数据集,包含id、object、position、x、y、z列
  • df2是较大数据集,包含id、object、position及其他列

需求:以id、object、position为匹配键,将df1的x、y、z映射到df2,匹配成功的行填充对应值,未匹配的行填充0。但尝试两种merge代码后,合并后的x/y/z列全为0,求正确实现方法。

尝试过的代码

第一种方法

merged_df = df2.merge(df1, left_on=['id', 'Column A', 'position'], right_on=['id', 'object', 'position'], how='left')

merged_df = merged_df.drop(columns=['object'])
merged_df = merged_df.rename(columns={'x_x': 'x', 'y_x': 'y', 'z_x': 'z'})

merged_df = merged_df.fillna(0)

第二种方法

merged_df = df1.merge(df2, on=['id', 'object', 'position'], how='left')

test_set_df['index'] = merged_df['index']

max_index_value = df2.index.max()
for index_value in range(1, max_index_value + 1):
    if index_value not in df1['index'].values:
        new_row = pd.DataFrame({'id': [''], 'object': [''], 'position': [''], 'x': [0], 'y': [0], 'z': [0], 'index': [index_value]})
        df1 = pd.concat([df1, new_row], ignore_index=True)

df1.sort_values(by='index', inplace=True)

df1.reset_index(drop=True, inplace=True)

df2.rename(columns={'x': 'x_alpha', 'y': 'y_alpha', 'z': 'z_alpha'}, inplace=True)

df2_annotated = df2

df2_annotated = df2_annotated.merge(test_set_df[['index', 'x', 'y', 'z']], on='index', how='left')

问题分析与正确实现

原代码问题

  1. 第一种方法中,left_on参数错误使用了Column A,而df2的对应匹配列应该是object,导致匹配完全失败,所有x/y/z列值为NaN,填充后全变为0。
  2. 第二种方法逻辑偏离需求,依赖index而非指定的id/object/position作为匹配键,无法完成正确映射。

正确代码

直接基于指定匹配键执行左连接,提取df1的x/y/z列并填充未匹配值:

# 仅保留df1中用于匹配和映射的列,避免冗余
merged_df = df2.merge(
    df1[['id', 'object', 'position', 'x', 'y', 'z']],
    on=['id', 'object', 'position'],
    how='left'
)

# 对未匹配的行填充0
merged_df[['x', 'y', 'z']] = merged_df[['x', 'y', 'z']].fillna(0)

补充:若df2本身包含x/y/z列

如果df2原有x/y/z列,需先重命名避免列名冲突:

# 重命名df2原有x/y/z列
df2 = df2.rename(columns={'x': 'x_original', 'y': 'y_original', 'z': 'z_original'})

# 执行合并并填充0
merged_df = df2.merge(
    df1[['id', 'object', 'position', 'x', 'y', 'z']],
    on=['id', 'object', 'position'],
    how='left'
).fillna(0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:01:04