You need to enable JavaScript to run this app. 如何基于df2指定规则对比修正df1列值,完成DataFrame数据更新
优惠活动
大模型
产品
解决方案
定价
更多

如何基于df2指定规则对比修正df1列值,完成DataFrame数据更新

Pandas DataFrame按自定义规则更新实现方案

实现思路

先处理原有df1的字段更新,再筛选出需要追加的df2记录合并到df1,全程保留原有df1的uuid字段不变。


具体实现步骤

步骤1:导入依赖并构造测试数据

import pandas as pd
import numpy as np

# 构造df1
df1 = pd.DataFrame([
    ['123abx-...', '001', 'DN', 'A'],
    ['3124ed-...', '002', 'HN', 'A'],
    ['125sqe-...', '003', 'HCM', 'A'],
    ['3123ew-...', '004', 'TD', 'B']
], columns=['uuid', 'idx', 'name', 'type'])

# 构造df2
df2 = pd.DataFrame([
    ['001', 'DN', 'A'],
    ['003', 'TPM', 'A'],
    ['004', 'TD', 'A'],
    ['006', 'HN', 'A'],
    ['007', 'BD', 'B']
], columns=['code', 'name', 'type'])

步骤2:处理df1原有记录的更新

# 先把df2的code字段重命名为idx,做映射表方便查询
df2_map = df2.rename(columns={'code': 'idx'}).set_index('name')

def update_row(row):
    name = row['name']
    # 不在df2里的记录不做修改
    if name not in df2_map.index:
        return row
    df2_idx = df2_map.loc[name, 'idx']
    df2_type = df2_map.loc[name, 'type']
    # 规则2:DN场景,idx和name都匹配时保留原值
    if name == 'DN' and row['idx'] == df2_idx:
        return row
    # 规则3:name匹配但idx不匹配,更新idx和type
    if row['idx'] != df2_idx:
        row['idx'] = df2_idx
        row['type'] = df2_type
    # 其他情况(idx和name都匹配,非DN场景)仅更新type
    else:
        row['type'] = df2_type
    return row

# 应用更新规则
df1_updated = df1.apply(update_row, axis=1)

步骤3:筛选需要追加到df1的记录

df1_idx_set = set(df1['idx'])
df1_name_set = set(df1['name'])

def need_append(row):
    code = row['code']
    name = row['name']
    # 规则4:idx匹配但name不匹配,需要追加
    if code in df1_idx_set and name not in df1_name_set:
        return True
    # 规则5:idx和name都不匹配,需要追加
    if code not in df1_idx_set and name not in df1_name_set:
        return True
    return False

# 筛选出需要追加的记录,补全uuid字段为na
df_append = df2[df2.apply(need_append, axis=1)].rename(columns={'code': 'idx'})
df_insert = pd.DataFrame({
    'uuid': np.nan,
    'idx': df_append['idx'],
    'name': df_append['name'],
    'type': df_append['type']
})

步骤4:合并得到最终结果

df_final = pd.concat([df1_updated, df_insert], ignore_index=True)
# 把uuid的空值替换为na字符串(可选,根据需求调整)
df_final['uuid'] = df_final['uuid'].fillna('na')
print(df_final)

运行结果

和需求期望的输出一致:

uuid  idx name type
0  123abx-...  001   DN    A
1  3124ed-...  006   HN    A
2  125sqe-...  003  HCM    A
3  3123ew-...  004   TD    A
4          na  003  TPM    A
5          na  007   BD    B

注:需求里期望结果写HN的idx为007属于笔误,按df2给出的HN对应code为006,实际运行结果完全符合规则要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 14:24:08