如何用Python Pandas逐行更新DataFrame?MSSQL场景需求求助
Pandas更新DataFrame的DIAGCODE字段方案
嘿,我来帮你搞定这个Pandas更新的问题!首先得说,尽量别用逐行循环——Pandas天生是为向量化操作设计的,逐行跑不仅慢,代码还啰嗦。根据你的场景,分两种常见情况给你方案:
情况1:两个DataFrame行顺序完全对应
如果dp的每一行刚好对应data的同一行(比如都是按相同的顺序从数据库读取的),那直接赋值就完事儿了,简单粗暴又高效:
# 直接把dp的DIAGCODE列覆盖到data的对应字段 data['DIAGCODE'] = dp['DIAGCODE']
情况2:需要通过共同键匹配更新(更常见的场景)
如果两个表是通过某个唯一标识列(比如患者ID、记录ID)关联的,那得用匹配映射的方式,举个例子,假设两个DataFrame都有PATIENT_ID这个共同键:
方法A:用merge合并后替换
先把dp里的键列和DIAGCODE列合并到data,再替换原字段:
# 只保留dp里需要的键列和DIAGCODE,避免合并冗余列 merged_df = data.merge( dp[['PATIENT_ID', 'DIAGCODE']], on='PATIENT_ID', how='left', # 保留data的所有行,即使dp里没有匹配项 suffixes=('_old', '') # 区分原DIAGCODE和新DIAGCODE ) # 把合并后的新DIAGCODE赋值回原data data['DIAGCODE'] = merged_df['DIAGCODE'] # 如果有匹配不到的行,想保留原来的DIAGCODE值,可以这么写: # data['DIAGCODE'] = merged_df['DIAGCODE'].fillna(data['DIAGCODE'])
方法B:用字典映射(更轻量)
把dp转换成键到DIAGCODE的字典,再用map函数快速映射:
# 创建PATIENT_ID到DIAGCODE的映射字典 diag_mapping = dp.set_index('PATIENT_ID')['DIAGCODE'].to_dict() # 把data里的PATIENT_ID映射成对应的DIAGCODE data['DIAGCODE'] = data['PATIENT_ID'].map(diag_mapping) # 同样,想保留原字段的空值匹配项,加个fillna: # data['DIAGCODE'] = data['PATIENT_ID'].map(diag_mapping).fillna(data['DIAGCODE'])
为啥不推荐逐行循环?
比如你可能试过for i in range(len(data))这种写法,当数据量上千上万的时候,这种方法的速度会比向量化操作慢几十甚至上百倍,完全没必要跟自己的电脑较劲😎
内容的提问来源于stack exchange,提问作者supar
相关产品推荐
相关产品推荐

