Python RecursionError: сбой простой операции с Pandas.eval()

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

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

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

Истинный

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

Мой фрейм данных содержит около 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')

person Imad    schedule 06.06.2018    source источник


Ответы (1)


Проблема в вашем воспроизводимом примере заключается в том, что у вас есть string. В ссылке, которую вы даете о High-Performance Pandas: 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, не уверен, что вы сможете найти решение с помощью механизма по умолчанию (поддерживаемые типы данных см. здесь)

person Ben.T    schedule 06.06.2018
comment
Спасибо :) Я сделал %timeit df_exade_light.eval('Date+Heure',engine='python') и результат 6.94 ms ± 309 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) так что действительно не быстрее - person Imad; 07.06.2018