Python RecursionError: Простая операция завершается с помощью Pandas.eval () - PullRequest
0 голосов
/ 06 июня 2018

Я только что прочитал и взволнован с волнением свыше этих недавно найденных функций оптимизации для моих Pandas связанных потребностей.Согласно этой книге:

Метод DataFrame.eval () позволяет гораздо более краткую оценку выражений со столбцами:

result3 = df.eval('(A + B) / (C - 1)') 
np.allclose(result1, result3)

True

К моему примеру:

Мой фрейм данных содержит около 42000 записей и 28 столбцов.Два из которых Date и Heure являются строками.

Моя цель: объединить оба столбца в один.Что я легко могу сделать с этим фрагментом кода: df_exade_light["Date"]+df_exade_light["Heure"], применение к нему %timeit возвращает

6,07 мс ± 219 мкс на цикл (среднее ± стандартное отклонение из 7 прогонов,По 100 циклов)

Но по какой-то причине df.eval('Date + Heure') возвращает:

RecursionError: превышена максимальная глубина рекурсии

Более того,Я применяю решение, найденное в этом потоке , чтобы увеличить допустимую глубину стека, но ядро ​​просто падает.

В чем причина этого?Я что-то не так делаю?


Проблема может быть воспроизведена с помощью этого кода:

import pandas as pd

df = pd.DataFrame({'A': ['X','Y'],
                   'B': ['U','V']})

df.eval('A+B')

1 Ответ

0 голосов
/ 06 июня 2018

Проблема в вашем воспроизводимом примере в том, что у вас есть строка .В ссылке вы даете о высокопроизводительных пандах: eval () и query () , все примеры с float (или int).

Один из способов заставить его работать с вашим примером - использовать python в качестве движка:

df.eval('A+B',engine='python')

По умолчанию, движок, используемый в eval, равен 'numexpr' в соответствии с документация и этот движок использует библиотеку с таким же именем NumExpr , которая является быстрым числовым выражением для NumPy .Хотя в предыдущей ссылке представлен пример со строкой, это не относится к операции + .Если вы делаете df.eval('A==B'), это работает, то же самое с другими операторами сравнения, но не df.eval('A+B').Вы можете найти больше информации там , но для string , кроме использования engine='python', оно кажется ограниченным.

Возвращаясь к исходной проблеме с типами date и time , не уверен, что вы можете найти решение с механизмом по умолчанию ( см. Здесь для получения информации о поддерживаемом типе данных)

...