Ошибка значения в df.transform(лямбда x: 0, если (x == 0) else (-np.log(-x), если x < 0, иначе np.log(x)))

#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 он медленный и не рекомендуется.