2017-08-07 6 views
1

je les données suivantes:division Gestion par zéro dans les calculs Pandas

a = pd.Series([1, 2, 3]) 
b = pd.Series([0, 0, 0]) 

S'il y a une division par zéro, je veux, dans certains cas

  1. mis le résultat à l'une des séries
  2. mis le résultat à une valeur spécifique

Mais les suivants donnent des résultats « inattendus »:

a.div(b, fill_value = 0) 
0 inf 
1 inf 
2 inf 

a.div(b).fillna(0) 
0 inf 
1 inf 
2 inf 

a.div(b).combine_first(a) 
0 inf 
1 inf 
2 inf 

Je veux arriver à:

cas 1: définir les données à une valeur spécifique

0 0 
1 0 
2 0 

Cas n ° 2: définir la valeur à une série spécifique

0 1 
1 2 
2 3 

Répondre

2

Vous pouvez utiliser df.replace après la division:

In [29]: (a/b).replace(np.inf, 0) 
Out[29]: 
0 0.0 
1 0.0 
2 0.0 
dtype: float64 

In [30]: (a/b).replace(np.inf, a) 
Out[30]: 
0 1.0 
1 2.0 
2 3.0 
dtype: float64 

Vous voulez gérer l'infini négatif aussi? Vous aurez besoin:

(a/b).replace((np.inf, -np.inf), (a, a)) 
1

Je pense que vous pouvez se Series.replace:

print (a.div(b.replace(0, np.nan)).fillna(0)) 
0 0.0 
1 0.0 
2 0.0 
dtype: float64 

print (a.div(b.replace(0, np.nan)).fillna(a)) 
0 1.0 
1 2.0 
2 3.0 
dtype: float64 
1

Vous pouvez également utiliser la fonction np.isinf pour vérifier les valeurs infinies et puis avec 0. Ex-, substituer

a = np.asarray(np.arange(5)) 
b = np.asarray([1,2,0,1,0]) 

c = a/b 
c[np.isinf(c)] = 0 

#result 
>>> c 
array([ 0. , 0.5, 0. , 3. , 0. ])