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

Python如何用一个DataFrame的值作为位置信息填充另一个DataFrame

问题描述

现有两个DataFrame,第一个为df1,结构如下:

df1:
     b1    b2    b3    b4
a1   0     0     0     0
a2   0     0     0     0
a3   0     0     0     0
a4   0     0     0     0

注:a类行索引、b类列名均为数值类型。

需要用第二个DataFramedf2的值填充df1,填充位置的映射关系存储在df2中,df2结构如下:

df2:
           namecol1     namecol2     namecol3
indexrow1  b1           a1           x1
indexrow2  b1           a3           x2
indexrow3  b1           a4           x3
indexrow4  b3           a2           y1
indexrow5  b3           a4           y2

注:表中x、y为任意数值。

填充规则:将namecol3列的值写入df1对应位置,其中namecol1值对应b类列名,namecol2值对应a类行索引,覆盖目标位置原有0值,最终得到的df1结构如下:

df1:
     b1    b2    b3    b4
a1   x1    0     0     0
a2   0     0     y1    0
a3   x2    0     0     0
a4   x3    0     y2    0

要求方案适配百万级以上数据量,保证高性能。


实现方案

以下3种方案均可实现需求,可根据数据量级选择最优实现:

  • 数据量450万条以内:选择pivot+.notna()方案,运行速度最快
  • 数据量超过450万条:选择pivot+.combine_first()方案,性能最优,处理1300万条数据耗时不超过1.6秒
  • 数据量50万条以内:可选update方案,代码更简洁,性能与前两种方案基本持平

pivot+.notna() 实现代码

# 基于df2生成行列与df1对应的透视表
pivot_df = df2.pivot(index='namecol2', columns='namecol1', values='namecol3')
# 对齐df1的行索引、列名,空位置填充0
pivot_df = pivot_df.reindex(index=df1.index, columns=df1.columns, fill_value=0)
# 用透视表中有效值覆盖df1对应位置
df1[pivot_df.notna()] = pivot_df

pivot+.combine_first() 实现代码

# 生成映射透视表
pivot_df = df2.pivot(index='namecol2', columns='namecol1', values='namecol3')
# 优先取透视表中的值,缺失位置保留df1原有0值
df1 = pivot_df.combine_first(df1)

update 实现代码

# 生成映射透视表
pivot_df = df2.pivot(index='namecol2', columns='namecol1', values='namecol3')
# 直接用透视表值更新df1对应位置
df1.update(pivot_df)

性能对比

三种方案在不同数据量级下的运行耗时对比如下图:
不同方案运行耗时对比图


内容的提问来源于stack exchange,提问作者T.A. Anderson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:27:17