Comment puis-je rendre les en-têtes de colonne de pandas dataframe tous en minuscules?


96

Je veux que tous les en-têtes de colonne de mon cadre de données pandas soient minuscules

Exemple

Si j'ai:

data =

  country country isocode  year     XRAT          tcgdp
0  Canada             CAN  2001  1.54876   924909.44207
1  Canada             CAN  2002  1.56932   957299.91586
2  Canada             CAN  2003  1.40105  1016902.00180
....

Je voudrais changer XRAT en xrat en faisant quelque chose comme:

data.headers.lowercase()

Pour que j'obtienne:

  country country isocode  year     xrat          tcgdp
0  Canada             CAN  2001  1.54876   924909.44207
1  Canada             CAN  2002  1.56932   957299.91586
2  Canada             CAN  2003  1.40105  1016902.00180
3  Canada             CAN  2004  1.30102  1096000.35500
....

Je ne connais pas les noms de chaque en-tête de colonne à l'avance.


10
Plus faciledf.columns = df.columns.str.lower()
Alex Montoya

Réponses:


175

Vous pouvez le faire comme ceci:

data.columns = map(str.lower, data.columns)

ou

data.columns = [x.lower() for x in data.columns]

exemple:

>>> data = pd.DataFrame({'A':range(3), 'B':range(3,0,-1), 'C':list('abc')})
>>> data
   A  B  C
0  0  3  a
1  1  2  b
2  2  1  c
>>> data.columns = map(str.lower, data.columns)
>>> data
   a  b  c
0  0  3  a
1  1  2  b
2  2  1  c

7
Notez que cela peut conduire à des noms de colonnes en double lorsque inférieur (colonne1) == inférieur (colonne2) (par exemple, «a» et «A»). Cela peut avoir des conséquences inattendues lors du référencement ultérieur des colonnes. (par exemple, data ['a'] renverra un DataFrame, pas une Series, avec toutes les colonnes nommées 'a'). Voir l'essentiel pour un exemple: gist.github.com/grisaitis/170e82a008480acb4fa3
grisaitis

1
[x.lower() for x in data.columns]équivaut à:[x.lower() for x in data]
joctee

Pendant que vous y êtes, il est bon d'utiliser[x.lower().strip() for x in df0]
Pawel Kranzberg

@PawelKranzberg Avez-vous une idée de la façon de réduire les noms de colonne deMultiIndex
curious_nustian

1
@curious_nustian - Oui, par exemple:df.index.names = [x.lower().strip() for x in df.index.names]
Pawel Kranzberg

99

Vous pouvez le faire facilement avec str.lowerpour columns:

df.columns = df.columns.str.lower()

Exemple:

In [63]: df
Out[63]: 
  country country isocode  year     XRAT         tcgdp
0  Canada             CAN  2001  1.54876  9.249094e+05
1  Canada             CAN  2002  1.56932  9.572999e+05
2  Canada             CAN  2003  1.40105  1.016902e+06

In [64]: df.columns = df.columns.str.lower()

In [65]: df
Out[65]: 
  country country isocode  year     xrat         tcgdp
0  Canada             CAN  2001  1.54876  9.249094e+05
1  Canada             CAN  2002  1.56932  9.572999e+05
2  Canada             CAN  2003  1.40105  1.016902e+06

19

Si vous souhaitez effectuer le changement de nom à l'aide d'un appel de méthode en chaîne, vous pouvez utiliser

data.rename(
    columns=unicode.lower
)

(Python 2)

ou

data.rename(
    columns=str.lower
)

(Python 3)


0

Voici un moyen simple: data.columns = data.columns.str.lower()


Cela donnera une erreur si le champ est numérique
Chadee Fouad le

0
df.columns = df.columns.str.lower()

est le plus simple mais donnera une erreur si certains en-têtes sont numériques

si vous avez des en-têtes numériques, utilisez ceci:

df.columns = [str(x).lower() for x in df.columns]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.