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

9voto

matthhias Points 191

Si vous devez gérer un grand nombre de colonnes nommées par le système de fourniture hors de votre contrôle, j'ai trouvé l'approche suivante qui est une combinaison d'une approche générale et de remplacements spécifiques en une seule fois.

Créez d'abord un dictionnaire à partir des noms de colonnes de la trame de données en utilisant des expressions régulières afin de jeter certains appendices de noms de colonnes, puis ajoutez des remplacements spécifiques au dictionnaire pour nommer les colonnes principales comme prévu plus tard dans la base de données réceptrice.

Cette opération est ensuite appliquée au cadre de données en une seule fois.

dict = dict(zip(df.columns, df.columns.str.replace('(:S$|:C1$|:L$|:D$|\.Serial:L$)', '')))
dict['brand_timeseries:C1'] = 'BTS'
dict['respid:L'] = 'RespID'
dict['country:C1'] = 'CountryID'
dict['pim1:D'] = 'pim_actual'
df.rename(columns=dict, inplace=True)

9voto

Omkar Darves Points 46

Si vous souhaitez simplement supprimer le signe '$', utilisez le code suivant

df.columns = pd.Series(df.columns.str.replace("$", ""))

8voto

Stryker Points 1474

En plus de la solution déjà fournie, vous pouvez remplacer toutes les colonnes pendant que vous lisez le fichier. Nous pouvons utiliser names et header=0 pour le faire.

Tout d'abord, nous créons une liste des noms que nous aimons utiliser comme noms de colonnes :

import pandas as pd

ufo_cols = ['city', 'color reported', 'shape reported', 'state', 'time']
ufo.columns = ufo_cols

ufo = pd.read_csv('link to the file you are using', names = ufo_cols, header = 0)

Dans ce cas, tous les noms de colonnes seront remplacés par les noms que vous avez dans votre liste.

6voto

seeiespi Points 48

Voici une petite fonction astucieuse que j'aime utiliser pour réduire le nombre de frappes :

def rename(data, oldnames, newname):
    if type(oldnames) == str: # Input can be a string or list of strings
        oldnames = [oldnames] # When renaming multiple columns
        newname = [newname] # Make sure you pass the corresponding list of new names
    i = 0
    for name in oldnames:
        oldvar = [c for c in data.columns if name in c]
        if len(oldvar) == 0:
            raise ValueError("Sorry, couldn't find that column in the dataset")
        if len(oldvar) > 1: # Doesn't have to be an exact match
            print("Found multiple columns that matched " + str(name) + ": ")
            for c in oldvar:
                print(str(oldvar.index(c)) + ": " + str(c))
            ind = input('Please enter the index of the column you would like to rename: ')
            oldvar = oldvar[int(ind)]
        if len(oldvar) == 1:
            oldvar = oldvar[0]
        data = data.rename(columns = {oldvar : newname[i]})
        i += 1
    return data

Voici un exemple de son fonctionnement :

In [2]: df = pd.DataFrame(np.random.randint(0, 10, size=(10, 4)), columns = ['col1', 'col2', 'omg', 'idk'])
# First list = existing variables
# Second list = new names for those variables
In [3]: df = rename(df, ['col', 'omg'],['first', 'ohmy'])
Found multiple columns that matched col:
0: col1
1: col2

Please enter the index of the column you would like to rename: 0

In [4]: df.columns
Out[5]: Index(['first', 'col2', 'ohmy', 'idk'], dtype='object')

1 votes

Le cas d'utilisation d'une telle fonction est extrêmement rare. Dans la plupart des cas, je sais ce que je cherche et ce à quoi je veux le renommer, je me contenterais de l'attribuer/modifier moi-même.

1 votes

@cs95 J'ai tendance à travailler avec de grandes enquêtes nationales ou internationales où les variables auront des noms de variables codés qui commencent par des préfixes selon les options de réponse, les échelles de likert et les branchements (comme EDU_2913.443, EDU_2913.421,...). Cette fonction m'a été très utile pour travailler avec ces types d'ensembles, je comprends si elle ne vous convient pas :)

6voto

Kaustubh J Points 92

En supposant que vous pouvez utiliser une expression régulière, cette solution supprime la nécessité d'un encodage manuel à l'aide d'une expression régulière :

import pandas as pd
import re

srch = re.compile(r"\w+")

data = pd.read_csv("CSV_FILE.csv")
cols = data.columns
new_cols = list(map(lambda v:v.group(), (list(map(srch.search, cols)))))
data.columns = new_cols

2 votes

Sur Stack Overflow, il est de bon ton d'expliquer pourquoi votre solution devrait fonctionner ou est meilleure que les solutions existantes. Pour plus d'informations, lisez Comment répondre .

0 votes

Vous avez remarqué que la réponse la mieux notée nécessite une certaine forme de codage dur et que la réponse la moins bien notée ne nécessite qu'une approche descriptive et procédurale ?

0 votes

Il existe de meilleures solutions (plus lisibles) que celle-ci, qui utilisent également les expressions rationnelles. Cette méthode en fait beaucoup plus qu'elle ne devrait pour une simple opération de renommage. Il y a aussi le risque que le motif ne corresponde à rien, auquel cas vous n'avez rien fait pour gérer les erreurs.

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