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

如何基于共同列将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:25:20