Jak mogę usunąć białe znaki z nagłówków Pandas DataFrame?

96

Analizuję dane z pliku Excela, który ma dodatkowe białe miejsce w niektórych nagłówkach kolumn.

Kiedy sprawdzam kolumny wynikowej ramki danych za pomocą df.columns, widzę:

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

W związku z tym nie mogę:

df["Month"]

Ponieważ powie mi, że kolumna nie została znaleziona, ponieważ poprosiłem o „Miesiąc”, a nie o „Miesiąc”.

Moje pytanie brzmi więc, jak usunąć niechciane białe znaki z nagłówków kolumn?

Spike Williams
źródło

Odpowiedzi:

142

Możesz nadać renamemetodzie funkcje . str.strip()Metoda powinna robić, co chcesz.

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]

Uwaga : zwraca to DataFrameobiekt i jest wyświetlany jako dane wyjściowe na ekranie, ale zmiany nie są w rzeczywistości ustawione w kolumnach. Aby wprowadzić zmiany, użyj:

  1. Użyj inplace=Trueargumentu [docs]
df.rename(columns=lambda x: x.strip(), inplace=True)
  1. Przypisz go z powrotem do swojej dfzmiennej:
df = df.rename(columns=lambda x: x.strip())
TomAugspurger
źródło
64

.str.stripJeśli używasz najnowszej wersji, możesz teraz po prostu wywołać kolumny:

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']

Czasy

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

Więc str.stripjest ~ 2X szybsze, spodziewam się, że będzie to lepiej skalowane dla większych plików dfs

EdChum
źródło
9

Jeśli używasz formatu CSV do eksportowania z programu Excel i odczytywania jako Pandas DataFrame, możesz określić:

skipinitialspace=True

podczas dzwonienia pd.read_csv.

Z dokumentacji :

skipinitialspace: bool, domyślnie False

Skip spaces after delimiter.
Eric Duminil
źródło