2013-04-26 13 views
8

Was ist der beste Weg, Zero Nenner zu behandeln, wenn Pandas DataFrame Spalten in Python voneinander zu trennen? zum Beispiel:Umgang mit Nullen in Pandas DataFrames Spaltenunterteilungen in Python

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

würde ich die Verhältnisse mag, wo der Nenner Null ist, wie NA registriert sein (numpy.nan). Wie kann dies in Pandas effizient gemacht werden?

Casting zu float64 funktioniert nicht auf der Ebene der Spalten:

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 

Wie kann ich es tun, nur für bestimmte Spalten und nicht ganzen df?

+3

Wenn Sie verwenden nur Floats, Sie erhalten +/- 'inf' – askewchan

+1

@askewchan: es funktioniert nicht für mich - siehe bearbeiten – user248237dfsf

Antwort

21

Sie müssen in Schwimmern arbeiten, sonst werden Sie Integer-Division haben, prob nicht, was Sie

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 

einen Weg, hier wollen

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 

Hier ist eine andere Art und Weise

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

Kann ich nur eine Spalte des df in float64 und nicht den ganzen Dataform umwandeln? Siehe meine Bearbeitung. Ich bekomme immer noch den Fehler mit float64 dtype – user248237dfsf

+1

ja in 0,11; 0.10.1 oder früher * sollte * funktionieren, welche Version verwendest du? – Jeff

+0

machen Sie auch eine '' np.seterr() '' irgendwo in Ihrer Codebasis? – Jeff

Verwandte Themen