Pandas转PySpark:SDD.loc[DFF.index, 'RDD']代码逻辑解析求助
Pandas代码解析与PySpark等效实现
一、原Pandas代码逻辑解析
SDD.loc[DFF.index, 'RDD'] = SDD.loc[DFF.index, 'DlvDate'] 的核心逻辑如下:
- 匹配行筛选:以DFF的MultiIndex(
SalesOrder、SOItem、SLNo三个字段的唯一组合)为匹配条件,从SDD中找出所有索引与该MultiIndex完全匹配的行。 - 列值更新:对筛选出的这些行,将它们的
DlvDate列值直接赋值给RDD列;SDD中不在DFF索引范围内的行,RDD列保持原有值不变。
注:这里隐含前提:SDD的行索引结构与DFF的MultiIndex完全一致(即SDD的索引也是
SalesOrder+SOItem+SLNo的组合),否则Pandas会自动尝试将MultiIndex的三个字段作为行匹配键进行筛选。
二、PySpark等效实现
PySpark没有MultiIndex概念,我们将DFF的三个索引字段作为关联键实现相同逻辑,分两种场景:
场景1:仅保留SDD中与DFF匹配的行并更新
如果只需要处理SDD中匹配DFF的行(不保留不匹配的行),用内关联+列赋值:
from pyspark.sql import functions as F # 从DFF中提取唯一的索引键组合 dff_unique_keys = DFF.select("SalesOrder", "SOItem", "SLNo").distinct() # 内关联匹配行,更新RDD列 updated_sdd = SDD.join(dff_unique_keys, on=["SalesOrder", "SOItem", "SLNo"], how="inner") \ .withColumn("RDD", F.col("DlvDate"))
场景2:保留SDD所有行,仅更新匹配的行
如果需要保留SDD全部行,仅对匹配DFF的行更新RDD列(完全对应原Pandas逻辑),用左关联+条件赋值:
from pyspark.sql import functions as F # 从DFF中提取唯一的索引键组合 dff_unique_keys = DFF.select("SalesOrder", "SOItem", "SLNo").distinct() # 左关联后,仅对匹配到的行更新RDD列,其余行保持原RDD值 updated_sdd = SDD.join(dff_unique_keys, on=["SalesOrder", "SOItem", "SLNo"], how="left") \ .withColumn( "RDD", F.when(F.col("SalesOrder").isNotNull(), F.col("DlvDate")).otherwise(F.col("RDD")) ) \ .drop("SalesOrder", "SOItem", "SLNo") # 移除关联带来的重复列
内容的提问来源于stack exchange,提问作者deb
相关产品推荐
相关产品推荐

