2016-08-31 4 views
0

Ich habe einen Datenrahmen "b" mit Zahlen als Text wie '12 .5% 'gespeichert. Eine Spalte ist:python apply function zu df pandas - atribute error

def sinPorc(tbl): 
    return float(tbl.replace('%', '')) 

aber wenn ich es anwenden versuche ich bekommen:

1  NaN 
2  NaN 
3  1.2% 
4  0.6% 
5  NaN 
6  1.4% 
7  0.1% 
8  NaN 
9  5.1% 
10  2.5% 
11 89.1% 
12  NaN 
Name: Idaho, dtype: object 

Ich habe eine Funktion jeder Spalte anzuwenden schrieb

b.Idaho.apply(sinPorc) 

AttributeError: 'float' object has no attribute 'replace'

Ich habe auch eine Beispieltabelle erstellt und die Funktion angewendet, aber in diesem Fall funktioniert:

ejemplo=pd.DataFrame({'A':['1.3%', 'NaN'], 
       'B':['1.3%', '0.7%']}) 

ejemplo.A.apply(sinPorc) 

und ich bekam das erwartete Ergebnis:

1.3 
    NaN 
Name: A, dtype: float64 

Ich weiß nicht, warum ich nicht die Funktion der ursprünglichen Tabelle anwenden können. Was könnte das Problem sein und was sollte ich tun, um es zu lösen?

Danke.

+1

Versuchen: 'float (str (TBL) .replace ('%', ''))' im 'def' function.You benötigen Zeilenelemente als' string' für die 'replace' werfen arbeiten. –

+0

Danke @NickilMaveli, es ist in Ordnung. Ich verstehe nicht, warum die ursprüngliche Funktion in der zweiten Tabelle funktioniert hat, ohne diese zu benötigen. – GabyLP

+0

Es klingt, als ob die Spalte bereits Float-Werte enthält. Ich habe versucht, mit den Werten als String-Typ und dann als Float-Typen zu replizieren. Es kann hilfreich sein, zu debuggen, indem Sie 'type (b.Idaho [0])' eingeben, vorausgesetzt, dass der Index 0 einen Wert hat, der nicht 'NaN' ist –

Antwort

2

Ihre ursprüngliche Methode nicht funktioniert, weil NaN kein String, aber der Schwimmer Wert np.NaN

Try this ...

np.NaN.replace('%', '') 

und Sie erhalten die gleichen Fehler.

AttributeError: 'float' object has no attribute 'replace' 

könnten Sie sinPorc zu

ändern
def sinPorc(tbl): 
    if tbl is np.NaN: 
     return tbl 
    else: 
     return float(tbl.replace('%', '')) 

Welche Ihre NaN Werte Erhalter, die für andere Pandas Funktionalität nützlich sind, oder Sie können den Wert in einen String zwingen, wie Nickil in den Kommentaren erwähnt.

float(str(tbl).replace('%', ''))