What's the best way to handle zero denominators when dividing pandas DataFrame columns by each other in Python? for example:
在Python中,当将熊猫DataFrame列相互分隔时,处理零分母的最佳方式是什么?例如:
df = pandas.DataFrame({"a": [1, 2, 0, 1, 5], "b": [0, 10, 20, 30, 50]})
df.a / df.b # yields error
I'd like the ratios where the denominator is zero to be registered as NA (numpy.nan
). How can this be done efficiently in pandas?
我希望分母为0的比率被注册为NA (numpy.nan)。如何在熊猫身上有效地做到这一点?
Casting to float64
does not work at level of columns:
对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
How can I do it just for particular columns and not entire df?
如何只针对特定的列而不是整个df?
1 个解决方案
#1
21
You need to work in floats, otherwise you will have integer division, prob not what you want
你需要使用浮点数,否则你会得到整数除法,而不是你想要的
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
Here's one way
这是方法之一
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
Here's another way
这是另一种方式
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
21
You need to work in floats, otherwise you will have integer division, prob not what you want
你需要使用浮点数,否则你会得到整数除法,而不是你想要的
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
Here's one way
这是方法之一
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
Here's another way
这是另一种方式
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