Wie kann ich das Leerzeichen aus Pandas DataFrame-Headern entfernen?

94

Ich analysiere Daten aus einer Excel-Datei, die in einigen Spaltenüberschriften zusätzlichen Leerraum enthält.

Wenn ich die Spalten des resultierenden Datenrahmens mit überprüfe df.columns, sehe ich:

Index(['Year', 'Month ', 'Value'])
                     ^
#                    Note the unwanted trailing space on 'Month '

Folglich kann ich nicht tun:

df["Month"]

Weil es mir sagt, dass die Spalte nicht gefunden wird, da ich nach "Monat" gefragt habe, nicht nach "Monat".

Meine Frage ist also, wie ich den unerwünschten Leerraum aus den Spaltenüberschriften entfernen kann.

Spike Williams
quelle

Antworten:

136

Sie können der renameMethode Funktionen zuweisen. Die str.strip()Methode sollte tun, was Sie wollen.

In [5]: df
Out[5]: 
   Year  Month   Value
0     1       2      3

[1 rows x 3 columns]

In [6]: df.rename(columns=lambda x: x.strip())
Out[6]: 
   Year  Month  Value
0     1      2      3

[1 rows x 3 columns]

Hinweis : Dies gibt ein DataFrameObjekt zurück und es wird als Ausgabe auf dem Bildschirm angezeigt, aber die Änderungen werden nicht tatsächlich in Ihren Spalten festgelegt. Verwenden Sie Folgendes, um die Änderungen vorzunehmen:

  1. Verwenden Sie das inplace=TrueArgument [docs]
df.rename(columns=lambda x: x.strip(), inplace=True)
  1. Weisen Sie es wieder Ihrer dfVariablen zu:
df = df.rename(columns=lambda x: x.strip())
TomAugspurger
quelle
62

Sie können jetzt einfach .str.stripdie Spalten aufrufen , wenn Sie eine aktuelle Version verwenden:

In [5]:
df = pd.DataFrame(columns=['Year', 'Month ', 'Value'])
print(df.columns.tolist())
df.columns = df.columns.str.strip()
df.columns.tolist()

['Year', 'Month ', 'Value']
Out[5]:
['Year', 'Month', 'Value']

Timings

In[26]:
df = pd.DataFrame(columns=[' year', ' month ', ' day', ' asdas ', ' asdas', 'as ', '  sa', ' asdas '])
df
Out[26]: 
Empty DataFrame
Columns: [ year,  month ,  day,  asdas ,  asdas, as ,   sa,  asdas ]


%timeit df.rename(columns=lambda x: x.strip())
%timeit df.columns.str.strip()
1000 loops, best of 3: 293 µs per loop
10000 loops, best of 3: 143 µs per loop

So str.stripist ~ 2X schneller, ich erwarte , dass dies besser für größere dfs maßstab

EdChum
quelle
8

Wenn Sie das CSV-Format verwenden, um aus Excel zu exportieren und als Pandas DataFrame zu lesen, können Sie Folgendes angeben:

skipinitialspace=True

beim anrufen pd.read_csv.

Aus der Dokumentation :

skipinitialspace: bool, Standardwert False

Skip spaces after delimiter.
Eric Duminil
quelle