¿Cómo puedo quitar el espacio en blanco de los encabezados de Pandas DataFrame?

94

Estoy analizando datos de un archivo de Excel que tiene espacio en blanco adicional en algunos de los encabezados de columna.

Cuando verifico las columnas del marco de datos resultante df.columns, veo:

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

En consecuencia, no puedo hacer:

df["Month"]

Porque me dirá que la columna no se encuentra, ya que pedí "Mes", no "Mes".

Entonces, mi pregunta es ¿cómo puedo eliminar el espacio en blanco no deseado de los encabezados de las columnas?

Spike Williams
fuente

Respuestas:

136

Puedes darle funciones al renamemétodo. El str.strip()método debe hacer lo que quieras.

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]

Nota : que esto devuelve un DataFrameobjeto y se muestra como resultado en la pantalla, pero los cambios no se establecen realmente en sus columnas. Para hacer que los cambios tengan lugar, use:

  1. Usa el inplace=Trueargumento [docs]
df.rename(columns=lambda x: x.strip(), inplace=True)
  1. Asígnelo de nuevo a su dfvariable:
df = df.rename(columns=lambda x: x.strip())
TomAugspurger
fuente
63

Ahora puede simplemente llamar .str.stripa las columnas si está usando una versión reciente:

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

Tiempos

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

Entonces, str.stripes ~ 2 veces más rápido, espero que esto se escale mejor para dfs más grandes

EdChum
fuente
8

Si usa el formato CSV para exportar desde Excel y leer como Pandas DataFrame, puede especificar:

skipinitialspace=True

al llamar pd.read_csv.

De la documentación :

skipinitialspace: bool, predeterminado Falso

Skip spaces after delimiter.
Eric Duminil
fuente