【问题标题】:Compare value of Dataframe column with list value将 Dataframe 列的值与列表值进行比较
【发布时间】:2018-11-14 00:40:44
【问题描述】:

我有一个 spark 数据框列“id”和“articles”以及一个值列表“a_list”,如下所示。

df = spark.createDataFrame([(1, 4), (2, 3), (5, 6)], ("id", "articles"))

a_list = [1, 4, 6]

我正在尝试将列表值与数据框列“文章”的值进行比较,如果发现匹配,则将列“E”更新为 1,否则为 0

我在下面的代码中使用“isin”

df['E'] = df.articles.isin(a_list).astype(int)

得到

TypeError:意外类型:<type 'type'>

我在这里错过了什么?

【问题讨论】:

    标签: python python-3.x pyspark


    【解决方案1】:

    将您的类型提供为字符串"int",而不是int,后者是spark 无法识别的python 原生type;同样要在 spark 数据框中创建列,请使用withColumn 方法而不是直接赋值:

    df.withColumn('E', df.articles.isin(a_list).astype('int')).show()
    +---+--------+---+
    | id|articles|  E|
    +---+--------+---+
    |  1|       4|  1|
    |  2|       3|  0|
    |  5|       6|  1|
    +---+--------+---+
    

    【讨论】:

    • Qq,所以不是用 int 类型更新列,如果我用文本更新它,对于 1= 已确认和对于 0 未确认,有没有办法在上述解决方案中做到这一点?
    • 您可以使用when.otherwise 有条件地创建列。 import pyspark.sql.functions as f; df.withColumn('E', f.when(df.articles.isin(a_list), 'confirmed').otherwise('not confirmed'))
    • 很抱歉再次打扰,如果我有多个列表,例如 a_list=[4, 10] , b_list=[11,6] , c_list=[3,4] 。我如何检查每个列表,如果找到匹配,将列“E”更新为“在 a_list 中找到”(如果在 a_list 中找到)或“在 b_list 中找到”(如果在 b_list 中找到)或“在 b_list 中找到”(如果找到在 c_list 中)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多