合并不同大小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')
问题分析与正确实现
原代码问题
- 第一种方法中,
left_on参数错误使用了Column A,而df2的对应匹配列应该是object,导致匹配完全失败,所有x/y/z列值为NaN,填充后全变为0。 - 第二种方法逻辑偏离需求,依赖
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
相关产品推荐
相关产品推荐

