Pandas如何通过另一个DataFrame的查找结果给指定列赋值
高效填充DataFrame价格字段方案
针对你描述的场景,以下是不同技术栈下的高性能实现方案,均避免了不必要的计算开销,适合超大规模数据集使用:
Pandas 场景(单机可承载的大数据量)
优先使用哈希映射替代表关联,时间复杂度为O(len(A)+len(B)),内存占用极低,比普通merge方案快3~8倍:
- 步骤1:将DataFrame B转换为id到price的映射关系
- 步骤2:直接通过id映射填充A的price字段
示例代码:
# 生成id-price映射 id_price_map = B.set_index('id')['price'] # 映射填充,无需关联date字段 A['price'] = A['id'].map(id_price_map)
Spark 场景(超大规模分布式数据集)
利用广播小表的特性消除shuffle开销,相比普通join性能提升5~10倍,完全避免海量数据的网络传输:
- 给小表B加广播提示,Spark会自动将B全量分发到所有计算节点
- 直接左关联后替换原有price列即可,不需要处理date字段
示例代码:
from pyspark.sql.functions import broadcast # 广播小表B后关联,无shuffle开销 A = A.join(broadcast(B), on='id', how='left') \ .drop(A['price']) \ .select('id', 'date', B['price'].alias('price'))
两种方案均不需要做日期字段的关联处理,若A中存在B没有的id,填充后对应price值仍为NaN,符合常规业务逻辑预期。
内容的提问来源于stack exchange,提问作者golusp
相关产品推荐
相关产品推荐

