【问题标题】:Flag data when value from one column is in another column当一列中的值在另一列中时标记数据
【发布时间】:2020-07-31 05:59:15
【问题描述】:

我正在尝试根据 2 个条件在我的数据集中创建一个标志,第一个很简单。 CheckingCol = CheckingCol2.

第二个更复杂。我有一个名为 TranID 的列和一个名为 RevID 的列。

如果 RevID 在 TranID AND CheckingCol = CheckingCol2 中,则该标志应返回“是”。否则,标志应返回“否”。

我的数据如下所示:

TranID   RevID   CheckingCol  CheckingCol2
1        2       ABC          ABC
2        1       ABC          ABC
3        6       ABCDE        ABCDE
4        3       ABCDE        ABC
5        7       ABCDE        ABC

预期的结果是:

TranID   RevID   CheckingCol  CheckingCol2  Flag
1        2       ABC          ABC           Yes
2        1       ABC          ABC           Yes
3        6       ABCDE        ABCDE         No
4        3       ABCDE        ABC           No
5        7       ABCDE        ABC           No

我尝试过使用:

df.withColumn("TotalMatch", when((col("RevID").contains(col("TranID"))) & (col("CheckingColumn") == col("CheckingColumn2")), "Yes").otherwise("No"))

但它不起作用,我无法在网上找到有关如何执行此操作的任何信息。

任何帮助都会很棒!

【问题讨论】:

  • F.lit("Yes") 而不是 "Yes"F.lit("No") 而不是 "No"
  • @pault contains 确实有效,但我意识到问题是 OP 在TranIDRevID 之间存在父子类型的问题,这就是为什么前两行被标记为@987654330 @
  • @pault 因此,以我的拙见,我认为它不是duplicate

标签: pyspark data-wrangling


【解决方案1】:

从 TranID 列获取唯一值作为数组,然后使用 isIn() 函数检查该数组中的 RevID

from pyspark.sql import functions as sf
unique_values = df1.agg(sf.collect_set("TranID").alias("uniqueIDs"))
unique_values.show()
+---------------+
|       uniqueIDs|
+---------------+
|[3, 1, 2, 5, 4]|
+---------------+

required_array = unique_values.take(1)[0].uniqueIDs
['3', '1', '2', '5', '4']

df2 = df1.withColumn("Flag", sf.when( (sf.col("RevID").isin(required_array) & (sf.col("CheckingCol") ==sf.col("CheckingCol2")) ) , "Yes").otherwise("No"))

注意:检查 RevID 和 TranID 列中的 null 和 NoneType 值,因为它们会影响结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-03
    • 2015-12-21
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    相关资源
    最近更新 更多