Question Renommer des colonnes dans les pandas


J'ai un DataFrame en utilisant des pandas et des étiquettes de colonnes que j'ai besoin de modifier pour remplacer les étiquettes de colonnes d'origine.

Je voudrais changer les noms de colonnes dans un DataFrame A où les noms de colonnes d'origine sont:

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

à

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

J'ai les noms de colonne édités l'ont stocké dans une liste, mais je ne sais pas comment remplacer les noms de colonne.


1080
2017-07-05 14:21


origine


Réponses:


Affectez-le simplement à .columns attribut:

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

1117
2017-07-05 14:23



Utilisez le df.rename() fonctionne et renvoie 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)

1859
2017-07-06 01:48



le rename méthode peut prendre une 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)

293
2018-05-21 09:58



Comme documenté dans http://pandas.pydata.org/pandas-docs/stable/text.html:

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

119
2018-05-30 13:24



Puisque vous ne voulez supprimer que le signe $ dans tous les noms de colonnes, vous pouvez simplement faire:

df = df.rename(columns=lambda x: x.replace('$', ''))

OU

df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

115
2018-03-26 10:20



Pandas 0.21+ réponse

Des modifications importantes ont été apportées au changement de nom de la colonne dans la version 0.21.

  • le rename méthode a ajouté le axis paramètre qui peut être réglé sur columns ou 1. Cette mise à jour rend cette méthode correspondre au reste de l'API pandas. Il a encore le index et columns paramètres mais vous n'êtes plus obligé de les utiliser.
  • le set_axis méthode avec le inplace mis à False vous permet de renommer toutes les étiquettes d'index ou de colonne avec une liste.

Exemples pour les pandas 0.21+

Construire un exemple 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

En utilisant 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 ont les conséquences suivantes:

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

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

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

le rename La fonction 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)

En utilisant set_axis avec une liste et inplace=False

Vous pouvez fournir une liste à set_axis méthode dont la longueur est égale au nombre de colonnes (ou d'index). Actuellement, inplace par défaut True, mais inplace sera par défaut 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 à assigner des colonnes directement comme ça. C'est une solution parfaitement bonne.

L'avantage d'utiliser set_axis est qu'il peut être utilisé dans le cadre d'une chaîne de méthode et qu'il renvoie une nouvelle copie du DataFrame. Sans cela, vous devrez stocker vos é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()

90
2017-10-24 13:39



df.columns = ['a', 'b', 'c', 'd', 'e']

Il remplacera les noms existants par les noms que vous fournissez, dans l'ordre que vous avez fourni.

Vous pouvez également les affecter par index comme ceci:

df.columns.values[2] = 'c'    #renames the 2nd column to 'c' (in position #3)

66
2018-03-22 08:59



old_names = ['$a', '$b', '$c', '$d', '$e'] 
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)

De cette façon, vous pouvez modifier manuellement le new_names comme vous le souhaitez. Fonctionne très bien lorsque vous ne devez renommer que quelques colonnes pour corriger les fautes d'orthographe, les accents, supprimer des caractères spéciaux, etc.


52
2018-05-21 17:48