2016-10-18 3 views
0

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

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) 

Это прекрасно работает. Какие-либо предложения?

ответ

0

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

if ret == None: 
    ... 

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

if ret is None: 
    ... 

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

Смежные вопросы