如何基于共同列将DataFrame列数据复制到另一DataFrame?求优化方案
嘿,你的这段循环代码虽然能实现需求,但在数据量变大的时候效率会拉胯——毕竟Pandas天生就是为向量化操作设计的,逐行遍历索引这种写法完全没发挥它的优势。给你几个更优的实现方式,不仅代码更简洁,运行速度还能提升N倍:
方法1:用
merge+fillna(逻辑最清晰,推荐) 这种思路是先把两个表按Account_No关联,再用df_acc的手机号去填充目标列,最后保留原df_addr的结构:
# 只合并需要的列,避免冗余数据 merged_df = df_addr.merge(df_acc[['Account_No', 'Phone_No']], on='Account_No', how='left') # 用Phone_No填充Phone列的空值;如果想直接覆盖所有行,去掉fillna就行 df_addr['Phone'] = merged_df['Phone'].fillna(merged_df['Phone_No'])
方法2:用
map快速映射 先把df_acc转成「账号-手机号」的字典,再直接映射到df_addr的Account_No列,效率极高:
# 构建账号到手机号的映射字典 phone_mapping = df_acc.set_index('Account_No')['Phone_No'].to_dict() # 映射填充,原Phone列中匹配不到账号的会保留原值;要全覆盖就去掉fillna df_addr['Phone'] = df_addr['Account_No'].map(phone_mapping).fillna(df_addr['Phone'])
方法3:用
update精准更新 如果只想更新df_addr中存在于df_acc里的账号对应的Phone值,用update最精准:
# 把df_acc转成以Account_No为索引的手机号Series phone_series = df_acc.set_index('Account_No')['Phone_No'] # 先把df_addr的索引设为Account_No,更新后再恢复原索引 df_addr.set_index('Account_No', inplace=True) df_addr['Phone'].update(phone_series) df_addr.reset_index(inplace=True)
为什么原代码不够好?
原代码的嵌套循环是逐行遍历处理,当数据量达到几万甚至几十万行时,速度会慢到难以忍受。上面这几种方法都是Pandas的向量化操作,内部是用C实现的,效率能提升几十甚至上百倍,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者harish bhavandla
相关产品推荐
相关产品推荐

