Modification d'un nom de colonne spécifique dans pandas DataFrame


195

Je cherchais un moyen élégant de changer un nom de colonne spécifié dans a DataFrame.

lire les données ...

import pandas as pd
d = {
         'one': [1, 2, 3, 4, 5],
         'two': [9, 8, 7, 6, 5],
         'three': ['a', 'b', 'c', 'd', 'e']
    }
df = pd.DataFrame(d)

La solution la plus élégante que j'ai trouvée jusqu'à présent ...

names = df.columns.tolist()
names[names.index('two')] = 'new_name'
df.columns = names

J'espérais un simple vol simple ... cette tentative a échoué ...

df.columns[df.columns.tolist().index('one')] = 'another_name'

Tous les indices reçus avec reconnaissance.

Réponses:


355

Il existe une doublure:

In [27]: df=df.rename(columns = {'two':'new_name'})

In [28]: df
Out[28]: 
  one three  new_name
0    1     a         9
1    2     b         8
2    3     c         7
3    4     d         6
4    5     e         5

Voici la docstring de la renameméthode.

Définition: df.rename (self, index = None, columns = None, copy = True, inplace = False)
Docstring:
Modifier l'index et / ou les colonnes à l'aide de la fonction d'entrée ou
les fonctions. Les valeurs de fonction / dict doivent être uniques (1 à 1). Étiquettes non
contenu dans un dict / Series sera laissé tel quel.

Paramètres
----------
index: dict ou fonction, facultatif
    Transformation à appliquer aux valeurs d'index
colonnes: dict ou fonction, facultatif
    Transformation à appliquer aux valeurs de colonne
copie: booléen, par défaut True
    Copiez également les données sous-jacentes
inplace: boolean, default False
    Indique s'il faut renvoyer un nouveau DataFrame. Si True, la valeur de la copie est
    ignoré.

Voir également
--------
Series.rename

Retour
-------
renommé: DataFrame (nouvel objet)

Cela ne fonctionne pas pour moi à moins que j'utilise le inplace = True comme indiqué dans la réponse @ Jeong-Yoon Lee.
JStrahl

108

Puisque l' inplaceargument est disponible, vous n'avez pas besoin de copier et d'assigner le bloc de données d'origine à lui-même, mais procédez comme suit:

df.rename(columns={'two':'new_name'}, inplace=True)

39

Qu'en est-il de?

df.columns.values[2] = "new_name"

11
en fait, cela ne fonctionne pas si plus tard vous utilisez le nom de la colonne sur d'autres opérations comme dans df ['new_name']
Master Yogurt

4
cette réponse m'a été utile pour changer une colonne spécifique en un nouveau nom. La 1ère colonne est l'index 0, la 2e colonne est l'index 1, etc. belle solution .. et je suis sûr que cela aidera plus de gens .. car les autres solutions nécessitent que vous connaissiez et copiez les noms de colonne d'origine à l'avance .... alors que c'est une méthode rapide et sale .. qui a ses propres utilisations.
ihightower

1
@MasterYogurt, votre commentaire n'est pas correct. Il est possible d'effectuer df['new_name'](et d'autres choses pandas) après avoir changé les variables comme indiqué ci-dessus. Votre commentaire était peut-être valide lors de sa publication initiale.
Jacob H

1
Cela étant dit, l'utilisation des renameméthodes est une meilleure solution.
Jacob H

6

Pandas 0.21 a maintenant un paramètre d'axe

La méthode de renommage a gagné un paramètre d'axe pour correspondre à la plupart des autres API de pandas.

Donc, en plus de cela:

df.rename(columns = {'two':'new_name'})

Tu peux faire:

df.rename({'two':'new_name'}, axis=1)

ou

df.rename({'two':'new_name'}, axis='columns')

df.rename ({'deux': 'nouveau_nom'}, axis = 'colonnes') Lance TypeError: Impossible de spécifier à la fois 'axe' et l'un des 'index' ou 'colonnes'.
HereHere

@HereHere Assurez-vous que vous êtes sur la version 0.21 de pandas. À faire pd.__version__pour vérifier votre version
Ted Petrou

5

Si vous savez de quelle colonne il s'agit (première / seconde / nième), cette solution publiée sur une question similaire fonctionne, qu'elle soit nommée ou non, et sur une seule ligne: https://stackoverflow.com/a/26336314/ 4355695

df.rename(columns = {list(df)[1]:'new_name'}, inplace=True)
# 1 is for second column (0,1,2..)

3

Pour renommer les colonnes, voici la méthode simple qui fonctionnera à la fois pour Default(0,1,2,etc;)les colonnes existantes et pas très utile pour des ensembles de données plus volumineux (ayant de nombreuses colonnes).

Pour un ensemble de données plus important, nous pouvons découper les colonnes dont nous avons besoin et appliquer le code ci-dessous:

df.columns = ['new_name','new_name1','old_name']

2

Le code court suivant peut vous aider:

df3 = df3.rename(columns={c: c.replace(' ', '') for c in df3.columns})

Supprimez les espaces des colonnes.


Je n'arrêtais pas de AttributeError: 'int' object has no attribute 'replace'vous en dire plus.
Nirmal

2

pandas version 0.23.4

df.rename(index=str,columns={'old_name':'new_name'},inplace=True)

Pour mémoire:

en omettant index = str donnera l'erreur remplacer a un argument inattendu 'colonnes'


1

Une autre option serait de simplement copier et déposer la colonne:

df = pd.DataFrame(d)
df['new_name'] = df['two']
df = df.drop('two', axis=1)
df.head()

Après cela, vous obtenez le résultat:

    one three   new_name
0   1   a       9
1   2   b       8
2   3   c       7
3   4   d       6
4   5   e       5

2
Cette méthode n'aidera pas si l'ordre des index des colonnes est important. La nouvelle colonne sera créée à la fin.
Loochie
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.