如何基于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
相关产品推荐
相关产品推荐

