2016-04-23 11 views
4

Nach dem Importieren einer Reihe von CSV-und XLS-Dateien, mit dem Header in der Datei. Ich habe bemerkt, dass diese Header nicht sauber sind, so dass, wenn ich sie anrufe, ein Fehler zurückgegeben wird, der sagt, dass es kein solches Attribut gibt. Was ich tun möchte, ist etwas Ähnliches;Header in importierten Pandas Datenrahmen reinigen

Verwenden Sie die integrierte Funktion zum Erstellen Liste der importierten Header

currentheaders = list(df.columns.values) 

reinigen diese Liste (das ist der Teil i auf bin stecken)

cleanedheaders = str.strip or regex equivalent 

diese Liste Nehmen als neue Header

Strip funktioniert nicht auf Listen und Regex möchte ein Datenrahmen sein, gibt es eine äquivalente Funktion n für eine Liste?

+0

Bitte definieren Sie "nicht sauber". Und bitte stellen Sie ausführbares Bit Code und Daten zur Verfügung; Dies könnte helfen, Antworten zu erhalten. – tfv

+0

Höchstwahrscheinlich haben Sie Probleme nicht nur mit den Headern, sondern auch mit den Daten. Sie sollten also versuchen, den Wert für den Parameter 'sep' zu finden. – MaxU

+2

Wenn Sie nur Ihre Spaltennamen entfernen möchten: 'df.columns = df.columns.str.strip() ' – MaxU

Antwort

1

Ein kompakter und qu ick Weg wäre

df.columns = [c.strip() for c in df.columns.values.tolist()] 

Wenn Sie DataFrame.rename() verwenden wollte dann würden Sie tatsächlich brauchen, nennen es wie folgt aus:

df.rename(columns={c: c.strip() for c in df.columns.values.tolist()}, inplace=True) 

oder Sie können das natürlich auch nutzen kompakt und schnell (geliehen von MaxU):

df.columns = df.columns.str.strip() 

Denken Sie daran, keine der oben genannten Lösungen funktioniert, wenn einer der Spaltennamen tatsächlich keine Zeichenfolge ist.

Wenn eine der Spaltennamen nicht ein String ist, dann im Idealfall würden Sie sie alle Saiten drehen, das funktionieren würde:

df.columns = [str(i) for i in df.columns.values.tolist()] 

oder wenn Sie nicht auf Spaltennamen drehen wollte Saiten - aus einem guten Grund, ich hoffe - dann müssten Sie folgendes tun:

df.rename(columns={c: c.strip() for c in df.columns.values.tolist() 
         if c not in [<list of columns not strings>]}, inplace=True) 
+0

Danke für die Erklärung Thanos, sie sind zum Glück alle Strings so Maxs Methode funktioniert –

1

Diese Lösung wird alle Elemente in einer Liste Streifen:

list = [' test1', ' test2 '] 
print [l.strip() for l in list] 

Ergebnis:

[ 'test1', 'test2']

3

Try this:

columns = {c: c.strip() for c in df.columns} # or any cleaning 
df.rename(columns, inplace=True)