2584 votes

Renommer les noms de colonnes dans Pandas

J'ai un DataFrame utilisant Pandas et des étiquettes de colonne que je dois modifier pour remplacer les étiquettes de colonne d'origine.

Je voudrais changer le nom des colonnes dans un DataFrame. A où se trouvent les noms des colonnes originales :

['$a', '$b', '$c', '$d', '$e']

à

['a', 'b', 'c', 'd', 'e'].

Les noms des colonnes modifiées sont stockés dans une liste, mais je ne sais pas comment remplacer les noms des colonnes.

7 votes

Vous pouvez consulter les documents officiels qui traitent du renommage des étiquettes de colonne : pandas.pydata.org/pandas-docs/stable/guide_utilisateur/text.html

3926voto

lexual Points 1849

RENOMMER DES COLONNES SPÉCIFIQUES

Utilisez le df.rename() et référencer les colonnes à renommer. Toutes les colonnes ne doivent pas être renommées :

df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy) 
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)

Exemple de code minimal

df = pd.DataFrame('x', index=range(3), columns=list('abcde'))
df

   a  b  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

Les méthodes suivantes fonctionnent toutes et produisent le même résultat :

df2 = df.rename({'a': 'X', 'b': 'Y'}, axis=1)  # new method
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis='columns')
df2 = df.rename(columns={'a': 'X', 'b': 'Y'})  # old method  

df2

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

N'oubliez pas de réaffecter le résultat, car la modification n'est pas en place. Alternativement, spécifiez inplace=True :

df.rename({'a': 'X', 'b': 'Y'}, axis=1, inplace=True)
df

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

A partir de la v0.25, vous pouvez également spécifier errors='raise' pour lever des erreurs si une colonne à renommer invalide est spécifiée. Voir v0.25 rename() docs .


RÉAFFECTER LES EN-TÊTES DE COLONNE

Utilisez df.set_axis() avec axis=1 et inplace=False (pour renvoyer une copie).

df2 = df.set_axis(['V', 'W', 'X', 'Y', 'Z'], axis=1, inplace=False)
df2

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

Cette méthode renvoie une copie, mais vous pouvez modifier le DataFrame sur place en définissant les paramètres suivants inplace=True (c'est le comportement par défaut pour les versions <=0.24 mais il est probable que cela change à l'avenir).

Vous pouvez également attribuer des en-têtes directement :

df.columns = ['V', 'W', 'X', 'Y', 'Z']
df

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

2 votes

Lorsque je fais cela avec un cadre de données à 6 colonnes (dataframe <press enter>) la représentation abrégée : code <class 'pandas.core.frame.DataFrame'> Int64Index : 1000 entrées, 0 à 999 Colonnes de données : BodyMarkdown 1000 non-null code fonctionne, mais lorsque je fais dataframe.head(), les anciens noms des colonnes réapparaissent.

15 votes

Je reçois le redoutable SettingWithCopyWarning: lorsque j'utilise le deuxième extrait de code de cette réponse.

0 votes

Existe-t-il une version de ce système avec remplacement de l'expression rationnelle ?

2426voto

eumiro Points 56644

Il suffit de l'attribuer à la .columns attribut :

>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df
   $a  $b
0   1  10
1   2  20

>>> df.columns = ['a', 'b']
>>> df
   a   b
0  1  10
1  2  20

386 votes

Est-il possible de modifier le nom d'un seul en-tête de colonne ?

146 votes

@ericmjl : supposons que vous voulez changer le nom de la première variable de df. Alors vous pouvez faire quelque chose comme : new_columns = df.columns.values; new_columns[0] = 'XX'; df.columns = new_columns

71 votes

Il semble que vous auriez pu simplement faire df.columns.values[0]='XX'.

481voto

Andy Hayden Points 38010

Le site rename peut prendre un fonction par exemple :

In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)

In [12]: df.rename(columns=lambda x: x[1:], inplace=True)

In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)

66 votes

Joli. Celui-ci a sauvé ma journée : df.rename(columns=lambda x: x.lstrip(), inplace=True)

2 votes

Similaire à @Root-11 -- dans mon cas, il y avait un caractère de point qui n'était pas imprimé dans la sortie console d'IPython, donc j'avais besoin de supprimer plus que les espaces blancs (rayures), donc : t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')

14 votes

df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True) est un joyau de sorte que nous pouvons écrire df.Column_1_Name au lieu d'écrire df.loc[:, 'Column 1 Name'] .

244voto

kadee Points 211

Comme le montre le document Travailler avec des données textuelles :

df.columns = df.columns.str.replace('$', '')

188voto

Ted Petrou Points 20559

Pandas 0.21+ Réponse

Des mises à jour importantes ont été apportées au renommage des colonnes dans la version 0.21.

  • Le site rename méthode a ajouté le axis qui peut être défini comme columns ou 1 . Cette mise à jour permet de faire correspondre cette méthode au reste de l'API pandas. Elle possède toujours l'attribut index et columns mais vous n'êtes plus obligé de les utiliser.
  • Le site set_axis méthode avec le inplace réglé sur False vous permet de renommer tous les libellés d'index ou de colonnes avec une liste.

Exemples pour Pandas 0.21+.

Construire un échantillon de DataFrame :

df = pd.DataFrame({'$a':[1,2], '$b': [3,4], 
                   '$c':[5,6], '$d':[7,8], 
                   '$e':[9,10]})

   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

Utilisation de rename avec axis='columns' ou axis=1

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')

ou

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)

Les deux aboutissent à ce qui suit :

   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

Il est encore possible d'utiliser l'ancienne méthode de signature :

df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})

Le site rename accepte également les fonctions qui seront appliquées à chaque nom de colonne.

df.rename(lambda x: x[1:], axis='columns')

ou

df.rename(lambda x: x[1:], axis=1)

Utilisation de set_axis avec une liste et inplace=False

Vous pouvez fournir une liste à la set_axis dont la longueur est égale au nombre de colonnes (ou d'index). Actuellement, inplace La valeur par défaut est True mais inplace La valeur par défaut sera False dans les prochaines versions.

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)

ou

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)

Pourquoi ne pas utiliser df.columns = ['a', 'b', 'c', 'd', 'e'] ?

Il n'y a rien de mal à affecter directement les colonnes de cette manière. C'est une solution parfaitement adaptée.

L'avantage d'utiliser set_axis est qu'elle peut être utilisée dans le cadre d'une chaîne de méthodes et qu'elle renvoie une nouvelle copie du DataFrame. Sans elle, vous devriez enregistrer les étapes intermédiaires de la chaîne dans une autre variable avant de réaffecter les colonnes.

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

1 votes

Merci pour le Pandas 0.21+ answer - J'ai raté cette partie dans la section "Quoi de neuf"...

1 votes

La solution ne semble pas fonctionner pour Pandas 3.6 : df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns'). Obtient un argument mot-clé inattendu "axis".

3 votes

Df.columns = ['a', 'b', 'c', 'd', 'e'] semble ne plus fonctionner, en travaillant avec la version 0.22 j'ai un avertissement disant Pandas ne permet pas de créer des colonnes via un nouveau nom d'attribut. . comment renommer si toutes mes colonnes portent le même nom :/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X