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

18voto

Crystal L Points 71

Si vous avez déjà une liste pour les nouveaux noms de colonnes, vous pouvez essayer ceci :

new_names = ['a', 'b', 'c', 'd', 'e']
new_names_map = {df.columns[i]:new_cols[i] for i in range(len(new_cols))}

df.rename(new_names_map, axis=1, inplace=True)

0 votes

Ceci est utile dans le cas où vous ne voulez pas spécifier les noms de colonnes existants. Dans mon cas, ils sont excessivement longs, je veux donc simplement passer les nouveaux noms.

12voto

Anton Protopopov Points 7767

Vous pourriez utiliser str.slice pour ça :

df.columns = df.columns.str.slice(1)

1 votes

PS : Ceci est un équivalent plus verbeux de df.columns.str[1:] ... probablement mieux d'utiliser ça, c'est plus court et plus évident.

12voto

sbha Points 1948

Une autre option consiste à renommer en utilisant une expression régulière :

import pandas as pd
import re

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

df = df.rename(columns=lambda x: re.sub('\$','',x))
>>> df
   a  b  c
0  1  3  5
1  2  4  6

11voto

Anil_M Points 5109

Ma méthode est générique et vous pouvez ajouter des délimiteurs supplémentaires en séparant les virgules. delimiters= variable et à l'épreuve du temps.

Code de travail :

import pandas as pd
import re

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

delimiters = '$'
matchPattern = '|'.join(map(re.escape, delimiters))
df.columns = [re.split(matchPattern, i)[1] for i in df.columns ]

Sortie :

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

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

10voto

oxer Points 315

Notez que les approches des réponses précédentes ne fonctionnent pas pour une MultiIndex . Pour un MultiIndex vous devez faire quelque chose comme ce qui suit :

>>> df = pd.DataFrame({('$a','$x'):[1,2], ('$b','$y'): [3,4], ('e','f'):[5,6]})
>>> df
   $a $b  e
   $x $y  f
0  1  3  5
1  2  4  6
>>> rename = {('$a','$x'):('a','x'), ('$b','$y'):('b','y')}
>>> df.columns = pandas.MultiIndex.from_tuples([
        rename.get(item, item) for item in df.columns.tolist()])
>>> df
   a  b  e
   x  y  f
0  1  3  5
1  2  4  6

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