При создании столбца на основании других столбцов, возникает ошибка: "ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(),..."

У меня есть DataFrame Пример:

    y   s   step_vol
0   1   10  90
1   0   20  87
2   1   15  1
3   2   80  7
4   3   90  90
5   4   1   54
6   0   10  12
7   3   90  12
8   1   65  90
9   0   12  143

Я хочу создать еще один столбец y_f, который будет иметь значение 1, если (data['y']>0) & (data['s']>limit) & (data['step_vol']>limit), где limit - определенное значение

Для этого пишу функцию:

def get_y(data, limit=50):
    if (data['y']>0) & (data['s']>limit) & (data['step_vol']>limit):
        data['y_f'] = 1
    else:
        data['y_f'] = 0
    return data['y_f']

Применяю функцию:

get_y(df, limit=50)

Возникает ошибка:

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

Как ее исправить?


Ответы (2 шт):

Автор решения: ivan100096

Вопроc решен Надо вот так делать:

def filter_size(row):
    if (row['y'] >1) & (row['s']>50) & (row['step_vol']>50):
        val = 1
    else:
        val = 0
    return val

df['y_f'] = df.apply(filter_size, axis=1)

Спасибо всем за ответы)

→ Ссылка
Автор решения: MaxU

Простой и быстрый (векторизированный) вариант решения - преобразовать результат условия из булевого в целый (8-битный int) столбец:

data['y_f'] = (  (data['y']>0) 
               & (data['s']>limit) 
               & (data['step_vol']>limit)).astype('int8')

или более короткий вариант:

data['y_f'] = data.eval("y > 0 and s > @limit and step_vol > @limit").astype('int8')

результат:

In [84]: data
Out[84]:
   y   s  step_vol  y_f
0  1  10        90    0
1  0  20        87    0
2  1  15         1    0
3  2  80         7    0
4  3  90        90    1
5  4   1        54    0
6  0  10        12    0
7  3  90        12    0
8  1  65        90    1
9  0  12       143    0

PS df.apply(..., axis=1) - один из самых медленных вариантов решения - "под капотом" это завуалированный for цикл. Его стоит использовать если других, более быстрых вариантов, нет

→ Ссылка