2017-10-19 1 views
0

Ich habe einen Datenrahmen, die etwa wie folgt aussieht:Pandas gelten Arbeiten auf einzelnen Spalten wie erwartet, aber nicht ganzer Datenrahmen

pd.DataFrame({'state':['AL','AL'],'statefp':[1.0,1.0]}) 
    state statefp 
0 AL  1.0 
1 AL  1.0 

Ich mag den gesamten Datenrahmen in type str drehen und bin die .apply Methode. Was ich tun möchte, ist, wenn das Element vom Typ float ist, möchte ich es als eine Zeichenfolge speichern Integer, und wenn es bereits eine Zeichenfolge ist, möchte ich es Kleinbuchstaben. Ich habe dies versucht:

df.apply(lambda x: '{:.0f}'.format(x) if isinstance(x,float) else x.astype(str).str.lower()) 

Welche dieser Ausgänge (nicht, was ich da statefp wollte Schwimmer als String gespeichert):

state statefp 
0 al  1.0 
1 al  1.0 

aber wenn ich das gleiche gilt für nur dass Spalte, es funktioniert gut:

>>>df.statefp.apply(lambda x: '{:.0f}'.format(x) if isinstance(x,float) else x.astype(str).str.lower()) 
0 1 
1 1 

Bin ich etwas fehlt, wie .apply auf der gesamten Datenrahmen zu arbeiten? Ich habe auch versucht, axis='columns' Argument von .apply zu setzen, aber das hat auch nicht funktioniert.

Auch ich bin offen für den Versuch, anderen Code, nicht nur .apply.

Antwort

0

Versuchen dtype anstelle:

df.apply(lambda x: x.astype(int).astype(str) if x.dtype==np.float else x.astype(str).str.lower()) 

Ausgang:

state statefp 
0 al  1 
1 al  1 

df.info() 

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 2 entries, 0 to 1 
Data columns (total 2 columns): 
state  2 non-null object 
statefp 2 non-null object 
dtypes: int32(1), object(1) 
memory usage: 104.0+ bytes 
+0

Wissen Sie, ob die 'dtype' von' np.NaN' ist 'np.float'? Es gibt einige 'NaN' in der 'statefp'-Spalte und es wirft diesen Fehler auf:' Kann NA nicht in ganze Zahlen umwandeln ',' trat bei Index-Status auf ' – LMc

+0

@ LMc Ja, np.Nan wird als np.float betrachtet. 'type (np.nan) == np.float' gibt True zurück –

Verwandte Themen