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

148voto

paulo.filip3 Points 246

Puisque vous voulez seulement supprimer le signe $ dans tous les noms de colonnes, vous pourriez simplement faire :

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

OU

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

1 votes

Celui-ci n'est pas seulement utile dans le cas de l'OP mais aussi dans les exigences génériques. Par exemple, pour diviser un nom de colonne par un séparateur et en utiliser une partie.

128voto

Nirali Khoda Points 1084

Renommer des colonnes dans Pandas est une tâche facile.

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

2 votes

Je vais monter ce projet puisqu'il est soutenu naturellement.

1 votes

Bien mieux que la solution approuvée

1 votes

El columns arg ici peut aussi être une fonction. Ainsi, si vous souhaitez supprimer le premier caractère de chaque nom, vous pouvez effectuer les opérations suivantes df.rename(columns=lambda name: name[1:], inplace=True) ( réf. )

90voto

M PAUL Points 773
df.columns = ['a', 'b', 'c', 'd', 'e']

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

5 votes

Ne pas modifier df.columns.values c'est faux. stackoverflow.com/questions/43291781/

0 votes

C'est exactement ce que je cherchais ! Merci !

76voto

migloo Points 700

Utilisez :

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. Cela fonctionne très bien lorsque vous n'avez besoin de renommer que quelques colonnes pour corriger des fautes d'orthographe, des accents, supprimer des caractères spéciaux, etc.

3 votes

J'aime cette approche, mais je pense df.columns = ['a', 'b', 'c', 'd', 'e'] est plus simple.

2 votes

J'aime cette méthode de zipper les anciens et les nouveaux noms. On peut utiliser df.columns.values pour obtenir les anciens noms.

1 votes

J'affiche la vue tabulaire et je copie les colonnes dans old_names. Je copie le tableau des exigences dans new_names. Puis j'utilise dict(zip(old_names, new_names)) Une solution très élégante.

41voto

firelynx Points 56

Noms de colonnes vs Noms de séries

Je voudrais expliquer un peu ce qui se passe en coulisses.

Les Dataframes sont un ensemble de séries.

Les séries sont à leur tour une extension d'une numpy.array .

numpy.array ont une propriété .name .

C'est le nom de la série. Il est rare que Pandas respecte cet attribut, mais il traîne par endroits et peut être utilisé pour pirater certains comportements de Pandas.

Nommer la liste des colonnes

Beaucoup de réponses ici parlent de la df.columns étant un list alors qu'il s'agit en fait d'un Series . Cela signifie qu'il a un .name attribut.

Voici ce qui se passe si vous décidez de remplir le nom des colonnes Series :

df.columns = ['column_one', 'column_two']
df.columns.names = ['name of the list of columns']
df.index.names = ['name of the index']

name of the list of columns     column_one  column_two
name of the index
0                                    4           1
1                                    5           2
2                                    6           3

Notez que le nom de l'index vient toujours une colonne plus bas.

Des artefacts qui perdurent

Le site .name l'attribut s'attarde parfois. Si vous définissez df.columns = ['one', 'two'] alors le df.one.name sera 'one' .

Si vous définissez df.one.name = 'three' puis df.columns vous donnera toujours ['one', 'two'] et df.one.name vous donnera 'three' .

MAIS

pd.DataFrame(df.one) retournera

    three
0       1
1       2
2       3

Parce que Pandas réutilise le .name de l'élément déjà défini Series .

Noms de colonnes à plusieurs niveaux

Pandas a des moyens de faire des noms de colonnes à plusieurs niveaux. Il n'y a pas tant de magie que cela, mais je voulais également aborder ce sujet dans ma réponse, car je ne vois personne qui s'y intéresse ici.

    |one            |
    |one      |two  |
0   |  4      |  1  |
1   |  5      |  2  |
2   |  6      |  3  |

Ceci est facilement réalisable en définissant les colonnes comme des listes, comme ceci :

df.columns = [['one', 'one'], ['one', 'two']]

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