2017-10-31 4 views
2

Ich habe einen Pandas Datenrahmen mit einer Spalte von ganzen Zahlen, die einige Nans enthält. Ich möchte sie von Integer in String umwandeln und die Nans durch eine Beschreibung wie 'nicht verfügbar' ersetzen.Wie man eine Dataframe Spalte in einen String konvertiert und Nans ersetzt (Fillna funktioniert nicht)

Der Hauptgrund ist, weil ich Groupbys für diese Spalte ausführen muss, und wenn ich die Nans nicht konvertiere, wird die Groupby sie loswerden! Warum das überhaupt passiert und wie die ganze Pandas-Gemeinschaft nicht in Waffen aufgestiegen ist, ist eine völlig getrennte Diskussion (als ich das zum ersten Mal erfahren habe, konnte ich es nicht glauben ...).

Ich habe den folgenden Code ausprobiert, aber es funktioniert nicht. Beachten Sie, dass ich sowohl astype(str) als auch astype('str' ausprobiert habe). In beiden Fällen wird die Spalte in Objekt konvertiert, nicht in Zeichenfolge. vielleicht, weil Python annimmt, dass die Länge der Strings variiert (falsch, sie haben alle die gleiche Länge in meinem Datenrahmen)? Aber vor allem funktioniert das fillna() nicht, und die Nans bleiben Nans! Warum? Irgendwelche Vorschläge? Vielen Dank!

import numpy as np 
import pandas as pd 

df= pd.DataFrame(np.random.randint(1,10,(10000,5)), columns=['a','b','c','d','e']) 
df.iloc[0,0]=np.nan 
df['a']=df['a'].astype(str) 
df['a']=df['a'].fillna('not available') 
print(df.dtypes) 
print(df.head()) 
+0

Strings in dtype Objekt gespeichert sind, man kann das ändern. . – Dark

+0

Oh mein ### @@@ !!! ## ... Ich habe gerade bemerkt, dass, wenn ich astype (Objekt) mache, fillna funktioniert. Aber warum auf der Erde? astype (str) konvertiert es bereits in ein Objekt. Ich verstehe nicht! –

+0

Fügen Sie die Pandas Version hinzu, die Sie verwenden. Das funktioniert gut für mich. – Dark

Antwort

3

fillna nicht, nachdem Sie diese Werte 'str' werfen arbeiten, Sie nicht mehr über eine np.nan in dieser Spalte, aber einen String-Wert 'nan':

df= pd.DataFrame(np.random.randint(1,10,(10000,5)), columns=['a','b','c','d','e']) 
df.iloc[0,0]=np.nan 
#df['a']=df['a'].astype(str) <-- You don't need this line. 
df['a']=df['a'].fillna('not available') 
print(df.dtypes) 
print(df.head()) 

Ausgang:

a object 
b  int32 
c  int32 
d  int32 
e  int32 
dtype: object 
       a b c d e 
0 not available 6 3 9 7 
1    5 4 5 5 3 
2    4 2 5 3 2 
3    4 9 2 8 3 
4    2 6 5 9 1 
+0

Oh yeah Ich dachte, OP stellte das .astype (str) als eine Option. Das ist nicht wichtig, aber die Antwort liegt da. – Dark

+0

2 Fragen: 1) Warum funktioniert Fillna nicht nach dem Casting zu String? 2) Mein kleines, benutztes-zu-SQL-Gehirn ist es gewohnt, Spalten zu haben, die Strings, Nunbers, Dates usw. sind. Es versteht nicht, warum Zahlen nicht in Strings konvertiert werden können und nicht verstehen, was "Objekt" wirklich ist. .. –

+0

fillna soll 'floating nans' ohne Strings füllen. – Dark

0
df= pd.DataFrame(np.random.randint(1,10,(10,5)), columns=['a','b','c','d','e']) 
df.iloc[0,0]=np.nan 

df.isnull() 
Out[329]: 
     a  b  c  d  e 
0 True False False False False 
1 False False False False False 
2 False False False False False 
3 False False False False False 
4 False False False False False 
5 False False False False False 
6 False False False False False 
7 False False False False False 
8 False False False False False 
9 False False False False False 

Nachdem Sie ändern

auf str
df['a']=df['a'].astype(str) 

df.isnull() 
Out[332]: 
     a  b  c  d  e 
0 False False False False False 
1 False False False False False 
2 False False False False False 
3 False False False False False 
4 False False False False False 
5 False False False False False 
6 False False False False False 
7 False False False False False 
8 False False False False False 
9 False False False False False 

Sie ändern den Wert Null, die np.nan bespannen ist 'nan'

df.iloc[0,0] 
Out[334]: 'nan' 
Verwandte Themen