#python #pandas
#python #панды
Вопрос:
Кто-нибудь знает, как это исправить?
>>> df = pd.DataFrame({'A': range(3), 'B': range(1, 4)})
>>> df
A B
0 0 1
1 1 2
2 2 3
>>> df.transform(lambda x: 0 if (x == 0) else (-np.log(-x) if x < 0 else np.log(x)))
ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index A')
Ответ №1:
x==0
возвращает последовательность True
и False
. Например, df['A'] == 0
возвращает a pd.Series
со [True, False, False]
значениями. Что if pd.Series([True, False, False])
должно означать? Это не имеет смысла, и именно поэтому оно неоднозначно.
Кроме того, apply
не использует векторизацию, поэтому избегайте ее.
Используйте np.select
вместо
df = np.select([df==0, df > 0, df < 0], [0, np.log(df), -np.log(-df)])
Если вы хотите глубже разобраться в ошибке Ошибка значения: ‘Значение истинности ряда неоднозначно. Используйте.empty , a.bool(), a.item(), a.any() или a.all(), просто погуглите это. Об этом есть множество сообщений stackoverflow
Комментарии:
1. Итак, нет способа реализовать это через функцию преобразования?
2. @happyastronaut есть способ, но
transform
он медленный и не рекомендуется.