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?

Spike Williams
la source

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())
TomAugspurger
la source
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

EdChum
la source
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.
Eric Duminil
la source