2016-06-15 14 views
1

ich Pandas Datenrahmen mit drei Spalten:Ersetzt Räume mit NAN in Pandas Datenrahmen

Name  Name2   DateTime 
          2016-06-10 05:22 
          2016-06-10 05:23 
          2016-06-10 14:25 
Guest  Guest1   2016-06-10 15:32 

ich mit NAN leere Räume zu ersetzen. So sollten AccountName und AccountName2 der Zeilen 1,2,3 und 4 NAN sein. Ich versuchte, die unter Anweisung:

df3['Name'] = df3['Name'].replace(r'[^\s+]',np.nan, regex=True) 

Aber da ich weiß Leerzeichen nach „Gast“ in Namen haben, alle 5 Reihen mit NAN ersetzt bekommen.

Edit:

Dies ist unsere tatsächlichen Daten.

Name    Name2     DateTime 
\t\t-\r\n\t  \t\t-\r\n\t   2016-06-10 05:22 
\t\t-\r\n\t  \t\t-\r\n\t   2016-06-10 05:23 
\t\t-\r\n\t  \t\t-\r\n\t   2016-06-10 14:25 
\t\tGuest\r\n\t \t\tGuest1\r\n\t  2016-06-10 15:32 

Ich habe dies verwendet, um diese Escape-Zeichen zu entfernen.

df['Name'] = df['Name'].str.replace('\r','').str.replace('\t','').str.replace('\n','').str.replace('-','') 

Nachdem ich diese Zeichen entfernt habe, bin ich mir nicht sicher, was an dieser Stelle eingefügt wird.

+0

Sie könnten die Räume streifen und dann ersetzen 'df [ 'Name'] str. .strip(). replace (r '[^ \ s +]', np.nan, regex = Wahr) ' – EdChum

+0

df ['Name'] hat den Typ float64. Ich versuche, es in String zu konvertieren und dann ersetzen, aber ich bin immer noch nicht erfolgreich. – user3447653

+1

Wie kann es float64 sein, wenn Sie Strings haben? – EdChum

Antwort

1

Eine andere Lösung, die durch boolean indexing Austausch aller Daten mit einer Länge 0 oder 1length von Daten und dann gefunden:

print (df.applymap(len)) 
    Name Name2 DateTime 
0  0  0  16 
1  0  0  16 
2  0  0  16 
3  5  6  16 

df[df.applymap(len) < 2] = np.nan 
print (df) 
    Name Name2   DateTime 
0 NaN  NaN 2016-06-10 05:22 
1 NaN  NaN 2016-06-10 05:23 
2 NaN  NaN 2016-06-10 14:25 
3 Guest Guest1 2016-06-10 15:32 
+1

Das funktioniert vollkommen in Ordnung. Danke – user3447653

+0

Super. Ich bin sehr glücklich, weil ich einmal ähnlichen Ersatz gemacht habe und es war Horror. – jezrael

+0

Yeah es zog mein Bein seit gestern, vielen Dank !! – user3447653

0

Wenn Sie sicher sind, dass zwischen den Namen keine Leerzeichen stehen, können Sie .strip() verwenden, um alle Leerzeichen (oder etwas anderes) an den Enden der Zeichenfolge zu entfernen.

df3['Name'] = df3['Name'].strip().replace(r'[^\s+]',np.nan, regex=True) 
+0

'strip' ist keine Methode für eine' Serie' 'str.strip' ist und es erfordert, dass der dtype' str' ist, was das OP bereits andeutete, dass es nicht – EdChum

+0

ist. Ah, ich sehe was das Problem ist. Vielleicht könnten Sie versuchen, ['DataFrame.applymap()'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.applymap.html#pandas.DataFrame.applymap) zu verwenden und jede davon zuzuordnen Element, das eine Funktion verwendet, die die Zeichenfolge streift und dann durch nan ersetzt. –

0

Da Sie die Leerzeichen nicht benötigen, sollte dies funktionieren.

df3['Name'] = df3['Name'].replace('[\s]+',"", regex=True) #Gets rid of all blank spaces 
df3['Name'] = df3['Name'].replace('',np.nan, regex=True) #Replace completely empty cells with nan 
Verwandte Themen