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

当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:03:26