Построить последовательное условие для when

#python #apache-spark #apache-spark-sql

#python #apache-spark #apache-spark-sql

Вопрос:

Я пытаюсь создать 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 является фреймом данных,

ids_colname это имя столбца моих идентификаторов,

modified_colname это имя столбца, которое я хочу изменить,

modification_list это список кортежей [(list_of_ids, new_value)]

У меня возникла эта ошибка:

 ValueError: Cannot convert column into bool: 
please use 'amp;' 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)
  

Это отлично работает. Есть предложения?

Ответ №1:

Я считаю, что проблема здесь:

 if ret == None:
   ...
  

В общем, вы никогда не должны использовать операторы равенства для сравнения с одноэлементными объектами в Python и всегда использовать is или is not :

 if ret is None:
    ...
  

В этом конкретном случае оператор равенства для столбца возвращает a Column , а Column объект явно запрещает преобразование в bool.