将连续条件构建为when

gojuced7  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(672)

我正在尝试构建一个连续的sql请求 when .

def build_modify_function(df, ids_colname, modified_colname, modification_list):
if len(modification_list) == 0:
    pass

# Small optimization

id_col      = df[ids_colname]
modif_col   = df[modified_colname]

# There is no "identity element" so :

ret = None
for (row_ids, new_value) in modification_list:
    if type(row_ids) != type(list()):
        row_ids = list(row_ids)
    if ret == None:
        ret = when(id_col.isin(row_ids), new_value) # .isin(row_ids)
    else:
        ret = ret.when(id_col.isin(row_ids), new_value)
return modif_col if ret == None else ret.otherwise(modif_col)
``` `df` 是一个Dataframe, `ids_colname` 是我ID的列名, `modified_colname` 是我要修改的列名, `modification_list` 是一个元组列表 `[(list_of_ids, new_value)]` 我有一个错误:

ValueError: Cannot convert column into bool:
please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

我不明白为什么。当我构建一个非常简单的函数时:

tmp = when(id_col.isin(row_ids), new_value)
return tmp
.when(id_col.isin(row_ids), new_value)
.otherwise(modif_col)

它非常有效。有什么建议吗?
pwuypxnk

pwuypxnk1#

我认为问题在于:

if ret == None:
   ...

一般来说,您不应该使用相等运算符与python中的单例对象进行比较,而应该始终使用相等运算符 is 或者 is not :

if ret is None:
    ...

在这种特殊情况下,列的相等运算符返回 Column 以及 Column 对象明确禁止转换为bool。

相关问题