Pandas:基于匹配条件向量化实现跨DataFrame列值移植
高效实现DataFrame按时间映射填充计算列
方法一:使用merge(对应SQL JOIN操作)
这是最贴合你SQL思路的方案,完全实现关联逻辑,且是Pandas原生向量化操作,性能远超循环:
- 先在df2中预计算目标列
monthlyObjAvg:
df2['monthlyObjAvg'] = df2['sale'] / df2['nbr']
- 用
merge将df1和处理后的df2按时间关联,保留df1所有行(对应SQL LEFT JOIN):
result_df = pd.merge(df1, df2[['time', 'monthlyObjAvg']], left_on='time_ref', right_on='time', how='left').drop('time', axis=1)
这里left_on指定df1的关联列,right_on指定df2的关联列,how='left'保证df1的所有行被保留,最后删除重复的time列即可。
方法二:使用map(更轻量的映射)
如果df2的time列是唯一值(你的示例满足该条件),可以构建映射字典后直接填充,速度更快:
- 构建时间到计算值的映射字典:
avg_map = (df2['sale'] / df2['nbr']).set_axis(df2['time']).to_dict()
- 在df1中直接映射填充:
df1['monthlyObjAvg'] = df1['time_ref'].map(avg_map)
性能优势说明
Pandas的merge和map都是向量化操作,底层基于C语言实现,避免了Python循环的性能开销,在百万级数据集上能将耗时从分钟级压缩到秒级甚至毫秒级,彻底解决你的性能问题。
验证结果
用你的示例数据测试,两种方法都会得到目标结果:
time time_ref monthlyObjAvg 0 10.10 01.10 6836.0 1 17.10 01.10 6836.0 2 24.10 01.10 6836.0 3 31.10 01.10 6836.0 4 07.11 01.11 6232.0 5 14.11 01.11 6232.0 6 21.11 01.11 6232.0 7 28.11 01.11 6232.0 8 05.12 01.12 6494.0
内容的提问来源于stack exchange,提问作者RiiNagaja
相关产品推荐
相关产品推荐

