2013-04-26 2 views
8

Каков наилучший способ обработки нулевых знаменателей при делении столбцов Pandas DataFrame друг на друга в Python? например:Обработка нулей в pandas Разделы столбцов DataFrames в Python

df = pandas.DataFrame({"a": [1, 2, 0, 1, 5], "b": [0, 10, 20, 30, 50]}) 
df.a/df.b # yields error 

Я хотел бы соотношения, где знаменатель равен нулю, чтобы быть зарегистрирован как NA (numpy.nan). Как это можно сделать эффективно в пандах?

Кастинг в float64 не работает на уровне столбцов:

In [29]: df 
Out[29]: 
    a b 
0 1 0 
1 2 10 
2 0 20 
3 1 30 
4 5 50 

In [30]: df["a"].astype("float64")/df["b"].astype("float64") 
... 

FloatingPointError: divide by zero encountered in divide 

Как я могу сделать это только для определенных столбцов, а не всего ФР?

+3

Если вы просто используете поплавки, вы получите +/- 'inf' – askewchan

+1

@askewchan: для меня это не работает - см. править – user248237dfsf

ответ

21

Вы должны работать в плотах, в противном случае вы будете иметь целочисленное деление проб не то, что вы хотите

In [12]: df = pandas.DataFrame({"a": [1, 2, 0, 1, 5], 
           "b": [0, 10, 20, 30, 50]}).astype('float64') 

In [13]: df 
Out[13]: 
    a b 
0 1 0 
1 2 10 
2 0 20 
3 1 30 
4 5 50 

In [14]: df.dtypes 
Out[14]: 
a float64 
b float64 
dtype: object 

Вот один из способов

In [15]: x = df.a/df.b 

In [16]: x 
Out[16]: 
0   inf 
1 0.200000 
2 0.000000 
3 0.033333 
4 0.100000 
dtype: float64 

In [17]: x[np.isinf(x)] = np.nan 

In [18]: x 
Out[18]: 
0   NaN 
1 0.200000 
2 0.000000 
3 0.033333 
4 0.100000 
dtype: float64 

Вот еще один способ

In [20]: df.a/df.b.replace({ 0 : np.nan }) 
Out[20]: 
0   NaN 
1 0.200000 
2 0.000000 
3 0.033333 
4 0.100000 
dtype: float64 
+1

Могу ли я использовать только столбец df в float64, а не весь файл данных? См. Мое редактирование. Я все еще получаю ошибку с float64 dtype – user248237dfsf

+1

да в 0.11; 0.10.1 или ранее * должен * работать, какую версию вы используете? – Jeff

+0

также вы делаете '' np.seterr() '' где-нибудь в своей кодовой базе? – Jeff

Смежные вопросы