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
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
Comment renommer une colonne spécifique dans les pandas?
A partir de v0.24 +, renommer une (ou plusieurs) colonne à la fois,
DataFrame.rename()
avec axis=1
ou axis='columns'
(l'argument axis
a été introduit dans _v0.21
_.
Index.str.replace()
pour le remplacement basé sur une chaîne/expression régulière.
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.
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.