Comment puis-je supprimer les espaces des en-têtes Pandas DataFrame?


94

J'analyse les données d'un fichier Excel contenant un espace blanc supplémentaire dans certains en-têtes de colonne.

Quand je vérifie les colonnes du dataframe résultant, avec df.columns, je vois:

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

Par conséquent, je ne peux pas faire:

df["Month"]

Parce qu'il me dira que la colonne n'est pas trouvée, comme j'ai demandé "Mois", pas "Mois".

Ma question est donc de savoir comment puis-je supprimer l'espace blanc indésirable des en-têtes de colonne?

Réponses:


136

Vous pouvez donner des fonctions à la renameméthode. La str.strip()méthode doit faire ce que vous voulez.

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]

Remarque : cela renvoie un DataFrameobjet et il est affiché comme sortie à l'écran, mais les modifications ne sont pas réellement définies sur vos colonnes. Pour effectuer les modifications, utilisez:

  1. Utilisez l' inplace=Trueargument [docs]
df.rename(columns=lambda x: x.strip(), inplace=True)
  1. Attribuez-le à votre dfvariable:
df = df.rename(columns=lambda x: x.strip())

63

Vous pouvez maintenant simplement appeler .str.striples colonnes si vous utilisez une version récente:

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

Alors str.strip c'est ~ 2X plus rapide, je m'attends à ce que cela s'adapte mieux pour des dfs plus grands


8

Si vous utilisez le format CSV pour exporter à partir d'Excel et lire comme Pandas DataFrame, vous pouvez spécifier:

skipinitialspace=True

en appelant pd.read_csv .

De la documentation :

skipinitialspace: booléen, False par défaut

Skip spaces after delimiter.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.