当ID匹配且np.isclose为真时,将DataFrame列复制至另一DataFrame
问题:基于ID匹配和数值近似条件更新DataFrame列值
先定义基础DataFrame:
import pandas as pd import numpy as np d={'ID': [3,4], 'SHAPE.x': [340329.0,3329433.0], 'SHAPE.y': [3329.0,0]} d2={'ID': [4,3], 'SHAPE.x': [3329600.0,340328.0], 'SHAPE.y': [111,222]} df = pd.DataFrame(data=d, index=[0,1]) df2 = pd.DataFrame(data=d2, index=[0,1])
初始df的输出:
ID SHAPE.x SHAPE.y 0 3 340329.0 3329.0 1 4 3329433.0 0.0
需求:当两行ID匹配且SHAPE.x数值近似(用np.isclose判断)时,将df2的SHAPE.x值覆盖到df的对应列,期望结果:
ID SHAPE.x SHAPE.y 0 3 340328.0 3329.0 1 4 3329433.0 0.0
尝试的方法及问题
1. 嵌套循环(修改未生效)
for index, row in df.iterrows(): for index2, row2 in df2.iterrows(): if row['ID'] == row2['ID']: if np.isclose(row['SHAPE.x'], row2['SHAPE.x']) == True: row['SHAPE.x'] = row2['SHAPE.x'] else: pass
问题:iterrows()返回的是行的副本,修改row不会同步到原DataFrame。
2. 单行loc语句(结果错误)
out = df.loc[(df['ID'] == df2['ID']) & (np.isclose(df['SHAPE.x'], df2['SHAPE.x']) == True), 'SHAPE.x'] = df2['SHAPE.x']
问题:直接按索引比较df['ID'] == df2['ID']逻辑错误——两个DataFrame的ID顺序不匹配(df索引0对应ID3,df2索引0对应ID4),导致条件判断完全错位。
正确实现方法
方法1:修正循环逻辑(适合梳理逻辑)
通过索引直接修改原DataFrame,避免操作副本:
for index, row in df.iterrows(): # 找到df2中ID匹配的行 match_row = df2[df2['ID'] == row['ID']] if not match_row.empty: match_val = match_row['SHAPE.x'].iloc[0] if np.isclose(row['SHAPE.x'], match_val): # 直接通过索引更新原df df.loc[index, 'SHAPE.x'] = match_val
方法2:向量化高效实现(推荐)
先将df2的SHAPE.x按ID对齐到df的结构,再用条件批量更新:
# 将df2的SHAPE.x按ID映射到df的每一行 df2_mapped = df2.set_index('ID')['SHAPE.x'].reindex(df['ID']).values # 生成更新条件:数值近似 mask = np.isclose(df['SHAPE.x'], df2_mapped) # 应用更新 df.loc[mask, 'SHAPE.x'] = df2_mapped[mask]
运行后df的输出与期望一致:
ID SHAPE.x SHAPE.y 0 3 340328.0 3329.0 1 4 3329433.0 0.0
内容的提问来源于stack exchange,提问作者ajd018
相关产品推荐
相关产品推荐

