Como posso remover os espaços em branco dos cabeçalhos do Pandas DataFrame?

94

Estou analisando dados de um arquivo Excel que tem espaço em branco extra em alguns títulos de coluna.

Quando eu verifico as colunas do dataframe resultante, com df.columns, vejo:

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

Consequentemente, não posso fazer:

df["Month"]

Porque me dirá que a coluna não foi encontrada, pois pedi "Mês" e não "Mês".

Minha pergunta, então, é como posso remover o espaço em branco indesejado dos títulos das colunas?

Spike Williams
fonte

Respostas:

136

Você pode atribuir funções ao renamemétodo. O str.strip()método deve fazer o que você quiser.

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]

Observação : isso retorna um DataFrameobjeto e é mostrado como saída na tela, mas as alterações não são realmente definidas em suas colunas. Para fazer as alterações, use:

  1. Use o inplace=Trueargumento [docs]
df.rename(columns=lambda x: x.strip(), inplace=True)
  1. Atribua-o de volta à sua dfvariável:
df = df.rename(columns=lambda x: x.strip())
TomAugspurger
fonte
63

Agora você pode simplesmente chamar .str.stripas colunas se estiver usando uma versão recente:

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

Horários

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

Portanto, str.stripé cerca de 2X mais rápido, espero que seja melhor escalonável para dfs maiores

EdChum
fonte
8

Se você usar o formato CSV para exportar do Excel e ler como Pandas DataFrame, poderá especificar:

skipinitialspace=True

ao ligar pd.read_csv.

Da documentação :

skipinitialspace: bool, default False

Skip spaces after delimiter.
Eric Duminil
fonte