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
相关产品推荐
相关产品推荐

