2017-10-19 17 views
0

J'ai un dataframe qui ressemble à ceci:Pandas appliquent des œuvres sur des colonnes individuelles comme prévu, mais pas toute dataframe

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

Je veux tourner l'ensemble dataframe dans le type str et je suis en utilisant la méthode .apply. Ce que je veux faire est si l'article est de type float, je veux le stocker comme une chaîne integer, et si c'est déjà une chaîne que je veux en minuscule. Je l'ai essayé ceci:

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

qui sort ce (pas ce que je voulais depuis statefp est stocké sous forme de chaîne float):

state statefp 
0 al  1.0 
1 al  1.0 

Cependant, quand j'utilise ce la même chose sur seulement cette colonne, il fonctionne très bien:

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

Suis-je manque quelque chose sur la façon dont .apply travaille sur l'ensemble dataframe? J'ai également essayé de mettre axis='columns' argument de .apply, mais cela n'a pas fonctionné non plus.

En outre, je suis ouvert à essayer d'autres codes, pas seulement .apply.

Répondre

0

Essayez d'utiliser DTYPE à la place:

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

Sortie:

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

savez-vous si le '' dtype' de np.NaN' est 'np.float'? Il y a du 'NaN' dans la colonne' statefp' et il lance cette erreur: 'Impossible de convertir NA en entier', 's'est produit à l'état statefp' – LMc

+0

@LMc Oui, np.Nan est considéré comme np.float. 'type (np.nan) == np.float' renvoie True –