Как удалить пробелы из заголовков Pandas DataFrame?

96

Я анализирую данные из файла Excel, в заголовках некоторых столбцов которого есть лишние пробелы.

Когда я проверяю столбцы полученного фрейма данных с помощью df.columns, я вижу:

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

Следовательно, я не могу:

df["Month"]

Потому что он скажет мне, что столбец не найден, поскольку я попросил «Месяц», а не «Месяц».

Тогда мой вопрос: как убрать нежелательные пробелы из заголовков столбцов?

Спайк Уильямс
источник

Ответы:

142

Вы можете передать функции renameметоду. str.strip()Метод должен делать то , что вы хотите.

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]

Примечание : это возвращает DataFrameобъект, и он отображается как вывод на экране, но на самом деле изменения в ваших столбцах не заданы. Чтобы изменения вступили в силу, используйте:

  1. Используйте inplace=Trueаргумент [документы]
df.rename(columns=lambda x: x.strip(), inplace=True)
  1. Верните его в свою dfпеременную:
df = df.rename(columns=lambda x: x.strip())
TomAugspurger
источник
64

Теперь вы можете просто вызвать .str.stripстолбцы, если вы используете последнюю версию:

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

Сроки

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

Так str.stripчто примерно в 2 раза быстрее, я ожидаю, что это лучше масштабируется для больших dfs

EdChum
источник
9

Если вы используете формат CSV для экспорта из Excel и читаете как Pandas DataFrame, вы можете указать:

skipinitialspace=True

при звонке pd.read_csv.

Из документации :

skipinitialspace: bool, по умолчанию False

Skip spaces after delimiter.
Эрик Думинил
источник