При создании столбца на основании других столбцов, возникает ошибка: "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 шт):
Вопро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)
Спасибо всем за ответы)
Простой и быстрый (векторизированный) вариант решения - преобразовать результат условия из булевого в целый (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 цикл. Его стоит использовать если других, более быстрых вариантов, нет