将 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 列的值与列表值进行比较的主要内容,如果未能解决你的问题,请参考以下文章
将 A 列的一个值与 Hive HQL 中 B 列的所有值进行比较