Сделайте pandas рейз при делении на ноль вместо inf

#pandas

#pandas

Вопрос:

Я хотел бы, чтобы pandas создавал исключение при делении на ноль, как в:

 d = {'col1': [2., 0.], 'col2': [4., 0.]}
df = pd.DataFrame(data=d)
2/df
  

Вместо текущего результата:

 0    1.000000
1         inf
Name: col1, dtype: float64
  

Есть предложения, как этого добиться?

Я знаю, что с помощью numpy я могу np.seterr(divide='raise') но pandas игнорирует это.

Большое спасибо

Комментарии:

1. Я не знаю, как pandas создает исключение для деления на ноль. Но, по крайней мере, вы можете использовать try: buffer = 2/df.values new_df = 2/df except Exception as e: print("Zero")

Ответ №1:

Более пристальный взгляд на исходный код и трассировку показывает, что внутри pandas вы можете найти множество обработчиков контекста, подобных этому:

with np.errstate(all='ignore'):

или

with numeric.errstate(all='ignore'):

Это причина, по которой np.seterr игнорируется, и, вероятно, нет простого способа избавиться от этого.

Ответ №2:

Это далеко от идеала, но одним из потенциальных вариантов является интерпретация элементов вашего фрейма данных как объектов Python, а не более оптимизированных numpy или pandas dtypes, которые он обычно использует:

 In [37]: d = {'col1': [2., 0.], 'col2': [4., 0.]}
    ...: df = pd.DataFrame(data=d)
    ...: 2/df

Out[37]:
   col1  col2
0   1.0   0.5
1   inf   inf

In [38]: 2 / df.astype('O')
---------------------------------------------------------------------------
ZeroDivisionError: float division by zero