将 Dataframe 列的值与列表值进行比较

Posted

技术标签:

【中文标题】将 Dataframe 列的值与列表值进行比较【英文标题】:Compare value of Dataframe column with list value 【发布时间】: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'>

我在这里错过了什么?

【问题讨论】:

【参考方案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 中)

以上是关于将 Dataframe 列的值与列表值进行比较的主要内容,如果未能解决你的问题,请参考以下文章

将文本值与目标文本行进行比较

MySQL查询将值与前一行的值进行比较

将 A 列的一个值与 Hive HQL 中 B 列的所有值进行比较

如何将列的当前值与sql server和Oracle中同一列的先前值进行比较

将列的值与该列 SQL 的平均值进行比较

如何将熊猫列的值设置为列表