【问题标题】:Pyspark: match columns from two different dataframes and add valuePyspark:匹配来自两个不同数据帧的列并添加值
【发布时间】:2021-11-18 01:50:19
【问题描述】:

我正在尝试比较不同数据框中存在的两列的值,以根据条件的匹配创建一个新的数据框:

df1=

| id |
| -- |
| 1  |
| 2  |
| 3  |
| 4  | 
| 5  |

df2 =

| id |
| -- |
| 2  |
| 5  |
| 1  |

所以,当df2的字段存在于df1的字段中时,我想在is_used字段中添加一个'x',否则添加'NA',以生成这样的结果数据框:

df3 =

| id | is_used |
| -- | ------- |
| 1  |    X    |
| 2  |    X    |
| 3  |    NA   |
| 4  |    NA   |
| 5  |    X    |

我已经尝试过这种方式,但是选择标准在所有列中都放置了一个“X”:

df3 = df3.withColumn('is_used', F.when(
    condition = (F.arrays_overlap(F.array(df1.id), F.array(df2.id))) == False,
    value = 'NA'
).otherwise('X'))

如果有任何帮助,我将不胜感激

【问题讨论】:

    标签: python dataframe pyspark jupyter-lab


    【解决方案1】:

    试试fullouter 加入:

    df3 = (
        df1.join(df2.alias("df2"), df1.id == df2.id, "fullouter")
        .withColumn(
            "is_used",
            F.when(F.col("df2.id").isNotNull(), F.lit("X")).otherwise(F.lit("NA")),
        )
        .drop(F.col("df2.id"))
        .orderBy(F.col("id"))
    )
    

    结果:

    +---+-------+                                                                   
    |id |is_used|
    +---+-------+
    |1  |X      |
    |2  |X      |
    |3  |NA     |
    |4  |NA     |
    |5  |X      |
    +---+-------+
    

    【讨论】:

    • 您好,我尝试了您的代码,但无法解决我的问题,非常感谢您。以与您类似的方式解决我的问题
    • @Mik3lmao 不客气。
    【解决方案2】:

    试试下面的代码,它会给你类似的结果,你可以进行其余的更改:

    
    df3 = df1.alias("df1").\
        join(df2.alias("df2"), (df1.id==df2.id), how='left').\
        withColumn('is_true', F.when(df1.id == df2.id,F.lit("X")).otherwise(F.lit("NA"))).\ 
        select("df1.*","is_true")
    
    df3.show()
    
    

    【讨论】:

    • 我已经尝试过您的代码,它可以工作,但我仍然遇到同样的问题,该列忽略了匹配条件并在所有行中添加了一个 X。我已经验证这是正确的,但是不,我的 df1 包含 261 条记录,我的 df2 包含 152 条记录,所以我应该只看到 152 个“X”,但我看到整个列都充满了“X”:(
    【解决方案3】:

    首先,我要感谢贡献代码的人,这对了解正在发生的事情非常有用。

    问题在于,当尝试执行 df1.id == df2.id Spark 时,因为它们都具有相同的名称,所以将两列推断为一列,因此所有迭代的结果将始终为 True。

    只需重命名我想比较的字段,它就完全适合我。

    代码如下:

    df2 = df2.withColumnRenamed("id", "id1")
    
    df3 = df1.alias("df1").join(df2.alias("df2"),
                                (df1.id == df2.id1), "left")
    
    df3 = df3.withColumn("is_used", F.when(df1.id == df2.id1), 
                         "X").otherwise("NA")
    
    df3 = df3.drop("id1")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      相关资源
      最近更新 更多