PySpark 3.0.1基于列表匹配修改列值时遇TypeError问题求助
解决PySpark中when条件的TypeError问题
嗨,我来帮你搞定这个PySpark的错误问题!
首先咱们得揪出你代码里的问题根源:
- 你用
df.filter(df['ID'].isin(list1))作为when()的第一个参数,但filter()返回的是DataFrame,而when()要求第一个参数必须是布尔类型的Column(也就是列级别的条件表达式),这直接触发了TypeError: condition should be a Column的报错。 - 另外你代码里的
otherwise(df['ID'])也不符合需求——你原本是想修改write_offs列的0值,不满足条件时应该保留原write_offs的值,而不是替换成ID的值哦。
下面是完全符合你需求的正确代码:
# 先导入需要的函数 from pyspark.sql.functions import when, col list1 = [299,570,73,401] # 正确修改write_offs列的逻辑 df = df.withColumn( 'write_offs', # 条件:ID在list1中 且 write_offs当前值为0 when( (col('ID').isin(list1)) & (col('write_offs') == 0), 1 # 满足条件时设置为1 ).otherwise(col('write_offs')) # 不满足条件时保留原write_offs值 )
简单拆解下这个逻辑:
col('ID').isin(list1)直接生成一个布尔类型的Column,用来标记哪些行的ID在目标列表里- 加上
& (col('write_offs') == 0),精准定位到需要修改的行(ID在list1且write_offs为0) when()会逐行应用这个条件,满足就设为1,否则保持原列的值
至于你说之前类似返回DataFrame的操作正常,那应该是那些操作本身就接受DataFrame作为输入(比如join、union这类),但when()是列级别的函数,必须用Column类型的条件表达式,这就是两者的核心区别啦。
内容的提问来源于stack exchange,提问作者J.C Guzman
相关产品推荐
相关产品推荐

