如何连接两个DataFrame获取全部行并生成符合规则的ClicksPerDay列
实现方案
你可以通过两个DataFrame的全外连接完成需求,具体实现逻辑如下:
- 先将第二个DataFrame的
Clicks列重命名为目标列名ClicksPerDay - 以
Location、Places作为关联键,对两个DataFrame执行全外连接,保证两边的所有行都保留 - 补全缺失的公共字段值:从你给出的示例来看,所有行的
Date、Date_part统一为7/1/2021,第二个表中独有的行默认Sector=Cars、Category=Passenger - 按需求调整
ClicksPerDay的显示规则:仅当Sector=Cars且Category=Passenger时保留值,其余情况置为空
PySpark 代码示例
from pyspark.sql import functions as F # 重命名列 df2_renamed = df2.withColumnRenamed("Clicks", "ClicksPerDay") # 全外连接两个表 df_join = df1.join(df2_renamed, on=["Location", "Places"], how="outer") # 补全缺失的字段值 df_filled = df_join \ .withColumn("Date", F.coalesce(F.col("Date"), F.lit("7/1/2021"))) \ .withColumn("Date_part", F.coalesce(F.col("Date_part"), F.lit("7/1/2021"))) \ .withColumn("Sector", F.coalesce(F.col("Sector"), F.lit("Cars"))) \ .withColumn("Category", F.coalesce(F.col("Category"), F.lit("Passenger"))) # 按规则调整ClicksPerDay的显示 df_result = df_filled.withColumn("ClicksPerDay", F.when((F.col("Sector") == "Cars") & (F.col("Category") == "Passenger"), F.col("ClicksPerDay")) .otherwise(None) )
Pandas 代码示例
逻辑和PySpark完全一致,替换对应API即可:
import pandas as pd # 重命名列 df2_renamed = df2.rename(columns={"Clicks": "ClicksPerDay"}) # 全外连接 df_join = pd.merge(df1, df2_renamed, on=["Location", "Places"], how="outer") # 补全缺失值 df_join["Date"] = df_join["Date"].fillna("7/1/2021") df_join["Date_part"] = df_join["Date_part"].fillna("7/1/2021") df_join["Sector"] = df_join["Sector"].fillna("Cars") df_join["Category"] = df_join["Category"].fillna("Passenger") # 调整ClicksPerDay显示规则 df_join["ClicksPerDay"] = df_join["ClicksPerDay"].where( (df_join["Sector"] == "Cars") & (df_join["Category"] == "Passenger") )
注:如果你需要保留示例中COL行(Sector=Trucks)的ClicksPerDay值,只需调整第四步的条件判断逻辑即可。
内容的提问来源于stack exchange,提问作者user175025
相关产品推荐
相关产品推荐

