web-dev-qa-db-fra.com

Renommer des colonnes spécifiques dans pandas

J'ai un cadre de données appelé data. Comment pourrais-je renommer le seul en-tête de colonne? Par exemple, gdp to log(gdp)?

data =
    y  gdp  cap
0   1    2    5
1   2    3    9
2   8    7    2
3   3    4    7
4   6    7    7
5   4    8    3
6   8    2    8
7   9    9   10
8   6    6    4
9  10   10    7
146
natsuki_2002
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)

Les rename indiquent qu’il accepte un dict en tant que paramètre pour columns, vous ne faites donc que passer un dict avec une seule entrée.

Voir aussi liés

281
EdChum

Une implémentation beaucoup plus rapide consisterait à utiliser list-comprehension si vous devez renommer une seule colonne.

df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]

Si vous devez renommer plusieurs colonnes, utilisez des expressions conditionnelles telles que:

df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]

Ou bien, créez un mappage à l'aide d'un dictionary et exécutez le list-comprehension avec l'opération get en définissant la valeur par défaut comme l'ancien nom:

col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'}   ## key→old name, value→new name

df.columns = [col_dict.get(x, x) for x in df.columns]

Timings:

%%timeit
df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
10000 loops, best of 3: 168 µs per loop

%%timeit
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
10000 loops, best of 3: 58.5 µs per loop
20
Nickil Maveli

Comment renommer une colonne spécifique dans les pandas?

A partir de v0.24 +, renommer une (ou plusieurs) colonne à la fois,

Si vous devez renommer TOUTES les colonnes à la fois,

  • DataFrame.set_axis() méthode avec _axis=1_. Passez une séquence semblable à une liste. Des options sont également disponibles pour la modification sur place.

rename avec _axis=1_

_df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df

   y gdp cap
0  x   x   x
1  x   x   x
2  x   x   x
3  x   x   x
4  x   x   x
_

Avec 0.21+, vous pouvez maintenant spécifier un paramètre axis avec rename:

_df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')

   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x
_

(Notez que rename n'est pas sur place par défaut, vous devrez donc affecter le résultat .)

Cet ajout a été fait pour améliorer la cohérence avec le reste de l'API. Le nouvel argument axis est analogue au paramètre columns: ils font la même chose.

_df.rename(columns={'gdp': 'log(gdp)'})

   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x
_

rename accepte également un rappel appelé une fois pour chaque colonne.

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

   y  g  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x
_

Pour ce scénario spécifique, vous voudriez utiliser

_df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
_

Index.str.replace

Semblable à la méthode replace des chaînes en python, pandas Index et Series (type de fichier d'objet uniquement) définissent une méthode ("vectorisée") _str.replace_ pour le remplacement basé sur des chaînes et des expressions rationnelles.

_df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df

   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x
_

L'avantage de cette méthode par rapport aux autres méthodes est que _str.replace_ prend en charge regex (activé par défaut). Voir la documentation pour plus d'informations.


Passer une liste à _set_axis_ avec _axis=1_

Appelez _set_axis_ avec une liste d’en-têtes. La liste doit avoir la même longueur que la taille des colonnes/index. _set_axis_ modifie par défaut le DataFrame d'origine, mais vous pouvez spécifier _inplace=False_ pour renvoyer une copie modifiée.

_df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)

  cap log(gdp)  y
0   x        x  x
1   x        x  x
2   x        x  x
3   x        x  x
4   x        x  x
_

Remarque: Dans les versions ultérieures, inplace sera par défaut sur True.

Chaînage de méthodes
Pourquoi choisir _set_axis_ alors que nous disposons déjà d’un moyen efficace d’affecter des colonnes à _df.columns = ..._? Comme le montre Ted Petrou dans [cette réponse], ( https://stackoverflow.com/a/46912050/4909087 ) _set_axis_ est utile lorsque vous essayez de chaîner des méthodes.

Comparer

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

Versus

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

Le premier est une syntaxe plus naturelle et fluide.

10
cs95