Побитовое условие в df.loc не дает ожидаемого результата - PullRequest
0 голосов
/ 04 февраля 2019

Я написал следующий код:

df.loc[((df['col_A'] == False) & (df['loc_B'] == False)), 'col_C'] = "abc"

, но «abc» записывается во все значения col_C вместо значений, указанных в условии.Почему это так?

Редактировать:

Мои столбцы являются объектами / строками, поэтому я попытался преобразовать их, используя следующую функцию:

def str_to_bool(s):
    if s == 'True':
         return True
    elif s == 'False':
         return False

Но возникает следующееошибка:

"The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()".

1 Ответ

0 голосов
/ 04 февраля 2019

Сначала преобразуйте серию в логическое значение, например, через pd.DataFrame.apply:

cols = ['col_A', 'col_B']
df[cols] = df[cols].apply(lambda x: x.eq('True'))

Затем примените свою логику, отметив, что ~ может использоваться для отрицания серии:

df.loc[~df['col_A'] & ~df['col_B'], 'col_C'] = "abc"

Или по закону де Моргана:

df.loc[~(df['col_A'] | df['col_B']), 'col_C'] = "abc"
...