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

3

我有一个Spark数据框,其中包含'id'和'articles'两列,还有一个以下的值列表'a_list'。

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

a_list = [1, 4, 6]

我正在尝试将列表值与数据框列“articles”的值进行比较,如果匹配,则将列'E'更新为1,否则为0。
我在下面的代码中使用了“isin”。
df['E'] = df.articles.isin(a_list).astype(int)

开始

类型错误:意外的类型:<type 'type'>

我这里缺少了什么?

1个回答

2

请使用字符串形式的"int"而不是Python本地的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|
+---+--------+---+

如果我不用 int 类型更新列,而是用文本更新它,比如 1=已确认,0=未确认,在上述解决方案中有没有办法这样做? - Umi
1
您可以使用 when.otherwise 条件地创建列。import pyspark.sql.functions as f; df.withColumn('E', f.when(df.articles.isin(a_list), 'confirmed').otherwise('not confirmed')) - Psidom
抱歉再次打扰,如果我有一个多个列表,如a_list=[4, 10],b_list=[11,6],c_list=[3,4]。我该如何检查每个列表,并在找到匹配项时将列“E”更新为“在a_list中找到”(如果在a_list中找到)或“在b_list中找到”(如果在b_list中找到)或“在c_list中找到”(如果在c_list中找到)。 - Umi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接