raw=True вызывает ошибку значения в кадре данных pandas.применить

#pandas #dataframe #numpy #numpy-ndarray

Вопрос:

Вот тестовый фрейм данных pandas для воспроизведения ошибки в pandas >= 1.1.0

 df = pd.DataFrame({'A':[1,2,5], 'B':['abc', 'cde', 4], 'C': [.01,4.5, 6.7]})
 

Что работает —

 def custom_func(row):
    if not isinstance(row[1], str):
        return row[0]   row[2]
    else:
        return 0
 

Примените функцию, как показано ниже —

 df.apply(lambda row: custom_func(row), axis=1, raw=True)
df.apply(lambda row: custom_func(row), axis=1)
 

В тот момент, когда мы возвращаем кортеж или несколько значений из пользовательской функции apply, она начинает выдавать ошибку значения.

Не Работает —

 def custom_func_does_not_work(row):
    if not isinstance(row[1], str):
        return row[0]   row[2], row[0]*row[2]
    else:
        return 0, row[0]
 

Применить функцию как —

 df.apply(lambda row: custom_func_does_not_work(row), axis=1, raw=True)
 

В тот момент , когда я удаляю raw=True , это работает нормально.

 df.apply(lambda row: custom_func_does_not_work(row), axis=1)
 

Если вы понизите рейтинг панд, скажем, до 0.23.4, это прекрасно работает raw=True .

Ошибка, которую вы видите в приведенном выше случае, заключается в —

 ValueError: Shape of passed values is (3, 2), indices imply (3, 3)
 

Я понимаю ошибку, но не уверен, что в ней есть скрытый переключатель, pandas.DataFrame.apply который может помочь нам вернуть кадр с raw=True

Причина, по которой я использую raw=True , заключается в чистой производительности, выше приведен небольшой пример, custom_func на самом деле намного сложнее и, следовательно, хотел бы использовать raw=True .