J'ai un DataFrame utilisant des pandas et des étiquettes de colonne que je dois modifier pour remplacer les étiquettes de colonne d'origine.
Je voudrais changer les noms de colonnes dans un DataFrame A
où les noms de colonnes d'origine sont:
['$a', '$b', '$c', '$d', '$e']
à
['a', 'b', 'c', 'd', 'e'].
J'ai les noms de colonnes modifiés stockés dans une liste, mais je ne sais pas comment remplacer les noms de colonnes.
Réponses:
Attribuez-le simplement à l'
.columns
attribut:la source
new_columns = df.columns.values;
new_columns[0] = 'XX';
df.columns = new_columns
df.rename(columns = {'$b':'B'}, inplace = True)
RENOMMER DES COLONNES SPÉCIFIQUES
Utilisez la
df.rename()
fonction et référez-vous aux colonnes à renommer. Toutes les colonnes ne doivent pas être renommées:Exemple de code minimal
Les méthodes suivantes fonctionnent toutes et produisent la même sortie:
N'oubliez pas de réattribuer le résultat, car la modification n'est pas en place. Vous pouvez également spécifier
inplace=True
:À partir de la version 0.25, vous pouvez également spécifier
errors='raise'
de générer des erreurs si une colonne à renommer non valide est spécifiée. Voir les documents v0.25rename()
.RÉASSIGNER LES EN-TÊTES DE COLONNE
Utilisez
df.set_axis()
avecaxis=1
etinplace=False
(pour renvoyer une copie).Cela renvoie une copie, mais vous pouvez modifier le DataFrame sur place en définissant
inplace=True
(il s'agit du comportement par défaut pour les versions <= 0,24, mais il est susceptible de changer à l'avenir).Vous pouvez également affecter directement des en-têtes:
la source
code
<class « pandas.core.frame.DataFrame »> Int64Index: 1000 entrées, 0 à 999 colonnes de données: BodyMarkdown 1000 non nulscode
travaux , mais quand je fais dataframe.head () les anciens noms des colonnes réapparaissent.SettingWithCopyWarning:
lorsque j'utilise le deuxième extrait de code dans cette réponse.df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
modifie le nom affiché, mais pas les éléments de la structure de données sous-jacente. Donc, si vous essayez,df['newName1']
vous obtiendrez une erreur. Ilinplace=True
est nécessaire d'éviter ce gotchya.La
rename
méthode peut prendre une fonction , par exemple:la source
df.rename(columns=lambda x: x.lstrip(), inplace=True)
t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)
est un joyau pour que nous puissions écriredf.Column_1_Name
au lieu d'écriredf.loc[:, 'Column 1 Name']
.Comme indiqué dans Utilisation des données de texte :
la source
Pandas 0.21+ Réponse
Il y a eu quelques mises à jour importantes pour renommer les colonnes dans la version 0.21.
rename
méthode a ajouté leaxis
paramètre qui peut être défini surcolumns
ou1
. Cette mise à jour rend cette méthode compatible avec le reste de l'API pandas. Il a toujours les paramètresindex
etcolumns
mais vous n'êtes plus obligé de les utiliser.set_axis
méthode avec l'inplace
ensembleFalse
vous permet de renommer toutes les étiquettes d'index ou de colonne avec une liste.Exemples pour Pandas 0.21+
Construisez un exemple de DataFrame:
Utilisation
rename
avecaxis='columns'
ouaxis=1
ou
Les deux aboutissent à ce qui suit:
Il est toujours possible d'utiliser l'ancienne signature de méthode:
La
rename
fonction accepte également les fonctions qui seront appliquées à chaque nom de colonne.ou
Utilisation
set_axis
avec une liste etinplace=False
Vous pouvez fournir à la
set_axis
méthode une liste dont la longueur est égale au nombre de colonnes (ou index). Actuellement, la valeur parinplace
défaut estTrue
, maisinplace
sera définie par défautFalse
dans les versions futures.ou
Pourquoi ne pas utiliser
df.columns = ['a', 'b', 'c', 'd', 'e']
?Il n'y a rien de mal à affecter directement des colonnes comme celle-ci. C'est une très bonne solution.
L'avantage de l'utilisation
set_axis
est qu'elle peut être utilisée dans le cadre d'une chaîne de méthodes et qu'elle renvoie une nouvelle copie du DataFrame. Sans cela, vous devrez stocker vos étapes intermédiaires de la chaîne dans une autre variable avant de réaffecter les colonnes.la source
Pandas 0.21+ answer
- en quelque sorte j'ai raté cette partie dans la partie "quoi de neuf" ...(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
Étant donné que vous souhaitez uniquement supprimer le signe $ dans tous les noms de colonne, vous pouvez simplement faire:
OU
la source
Il remplacera les noms existants par les noms que vous fournissez, dans l'ordre que vous fournissez.
la source
df.columns.values
, c'est faux. stackoverflow.com/questions/43291781/…De cette façon, vous pouvez modifier manuellement le
new_names
comme vous le souhaitez. Fonctionne très bien lorsque vous devez renommer seulement quelques colonnes pour corriger les fautes d'orthographe, les accents, supprimer les caractères spéciaux, etc.la source
df.columns = ['a', 'b', 'c', 'd', 'e']
c'est plus simple.df.columns.values
pour obtenir les anciens noms.myList = list(df) myList[10:20]
:, etc - donc c'est parfait.namez = df.columns.values
suivis de quelques modifications, ensuitedf.columns = namez
.Solutions en ligne ou en pipeline
Je vais me concentrer sur deux choses:
OP indique clairement
Je ne veux pas résoudre le problème de la façon de remplacer
'$'
ou de supprimer le premier caractère de chaque en-tête de colonne. OP a déjà fait cette étape. Au lieu de cela, je veux me concentrer sur le remplacement de l'columns
objet existant par un nouveau étant donné une liste de noms de colonnes de remplacement.df.columns = new
oùnew
est la liste des nouveaux noms de colonnes est aussi simple que possible. L'inconvénient de cette approche est qu'elle nécessite la modification de l'attribut du cadre de données existantcolumns
et qu'elle n'est pas effectuée en ligne. Je vais montrer quelques façons d'effectuer cela via le pipelining sans modifier le cadre de données existant.Configuration 1
Pour me concentrer sur la nécessité de renommer les noms de colonne de remplacement par une liste préexistante, je vais créer un nouvel exemple de trame
df
de données avec les noms de colonne initiaux et les nouveaux noms de colonne non liés.Solution 1
pd.DataFrame.rename
Il a déjà été dit que si vous aviez un dictionnaire mappant les anciens noms de colonne aux nouveaux noms de colonne, vous pourriez utiliser
pd.DataFrame.rename
.Cependant, vous pouvez facilement créer ce dictionnaire et l'inclure dans l'appel à
rename
. Ce qui suit tire parti du fait que lors de l'itérationdf
, nous itérons sur chaque nom de colonne.Cela fonctionne très bien si vos noms de colonnes d'origine sont uniques. Mais s'ils ne le sont pas, cela tombe en panne.
Configurer 2
colonnes non uniques
Solution 2 en
pd.concat
utilisant l'keys
argumentTout d'abord, notez ce qui se passe lorsque nous essayons d'utiliser la solution 1:
Nous n'avons pas mappé la
new
liste en tant que noms de colonne. Nous avons fini par répétery765
. Au lieu de cela, nous pouvons utiliser l'keys
argument de lapd.concat
fonction tout en parcourant les colonnes dedf
.Solution 3
Reconstruire. Cela ne doit être utilisé que si vous en avez un
dtype
pour toutes les colonnes. Sinon, vous vous retrouverez avecdtype
object
pour toutes les colonnes et les reconvertir nécessite plus de travail de dictionnaire.Célibataire
dtype
Mixte
dtype
Solution 4
Ceci est un truc gimmicky avec
transpose
etset_index
.pd.DataFrame.set_index
nous permet de définir un index en ligne mais il n'y a pas de correspondantset_columns
. Nous pouvons donc transposer, puisset_index
transposer en arrière. Cependant, la même mise en garde uniquedtype
ou mixtedtype
de la solution 3 s'applique ici.Célibataire
dtype
Mixte
dtype
Solution 5
Utilisez un
lambda
danspd.DataFrame.rename
qui parcourt chaque élément denew
Dans cette solution, nous passons un lambda qui le prend
x
mais l'ignore ensuite. Cela prend aussi uny
mais ne s'y attend pas. Au lieu de cela, un itérateur est donné comme valeur par défaut et je peux ensuite l'utiliser pour parcourir un à la fois sans tenir compte de la valeur dex
.Et comme me l'ont fait remarquer les gens dans le chat sopython , si j'ajoute un
*
entrex
ety
, je peux protéger may
variable. Cependant, dans ce contexte, je ne pense pas qu'il ait besoin d'être protégé. Cela vaut encore la peine d'être mentionné.la source
df.rename(lambda x : x.lstrip('$'),axis=1)
x
est ignoré?Noms des colonnes et noms des séries
Je voudrais expliquer un peu ce qui se passe dans les coulisses.
Les trames de données sont un ensemble de séries.
Les séries sont à leur tour une extension
numpy.array
numpy.array
s ont une propriété.name
C'est le nom de la série. Il est rare que les pandas respectent cet attribut, mais il persiste par endroits et peut être utilisé pour pirater certains comportements des pandas.
Nommer la liste des colonnes
Beaucoup de réponses ici parlent de l'
df.columns
attribut étant unlist
alors qu'en fait c'est unSeries
. Cela signifie qu'il a un.name
attribut.Voici ce qui se passe si vous décidez de renseigner le nom des colonnes
Series
:Notez que le nom de l'index vient toujours une colonne plus bas.
Des artefacts qui persistent
L'
.name
attribut persiste parfois. Si vous définissezdf.columns = ['one', 'two']
alors ledf.one.name
sera'one'
.Si vous vous mettez
df.one.name = 'three'
alorsdf.columns
vous donnera toujours['one', 'two']
, etdf.one.name
vous donnera'three'
MAIS
pd.DataFrame(df.one)
reviendraParce que les pandas réutilisent
.name
le déjà définiSeries
.Noms de colonnes à plusieurs niveaux
Pandas a des façons de faire des noms de colonnes à plusieurs couches. Il n'y a pas tellement de magie en jeu, mais je voulais aussi couvrir cela dans ma réponse, car je ne vois personne en parler ici.
Ceci est facilement réalisable en définissant des colonnes sur des listes, comme ceci:
la source
Si vous avez le dataframe, df.columns vide tout dans une liste que vous pouvez manipuler puis réaffecter dans votre dataframe en tant que noms de colonnes ...
Meilleur moyen? IDK. Un moyen - oui.
Une meilleure façon d'évaluer toutes les principales techniques proposées dans les réponses à la question est ci-dessous en utilisant cProfile pour mesurer la mémoire et le temps d'exécution. @kadee, @kaitlyn et @eumiro avaient les fonctions avec les temps d'exécution les plus rapides - bien que ces fonctions soient si rapides que nous comparons l'arrondi de .000 et .001 secondes pour toutes les réponses. Morale: ma réponse ci-dessus n'est probablement pas la «meilleure» façon.
la source
Disons que c'est votre dataframe.
Vous pouvez renommer les colonnes à l'aide de deux méthodes.
En utilisant
dataframe.columns=[#list]
La limitation de cette méthode est que si une colonne doit être modifiée, la liste complète des colonnes doit être transmise. En outre, cette méthode n'est pas applicable sur les étiquettes d'index. Par exemple, si vous avez réussi ceci:
Cela générera une erreur. Non-concordance de longueur: l'axe prévu a 5 éléments, les nouvelles valeurs ont 4 éléments.
Une autre méthode est la
rename()
méthode Pandas qui est utilisée pour renommer tout index, colonne ou ligneDe même, vous pouvez modifier n'importe quelle ligne ou colonne.
la source
Si votre nouvelle liste de colonnes est dans le même ordre que les colonnes existantes, l'affectation est simple:
Si vous aviez un dictionnaire composé d'anciens noms de colonne pour de nouveaux noms de colonne, vous pouvez effectuer les opérations suivantes:
Si vous n'avez pas de liste ou de mappage de dictionnaire, vous pouvez supprimer le
$
symbole de tête via une compréhension de liste:la source
lambda col: d[col]
vous pourriez passerd.get
... donc ça ressemblerait àdf.columns.map(d.get)
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html
la source
Comprenons le changement de nom par un petit exemple ...
1.Renommer les colonnes à l'aide du mappage:
2. Renommer l'index / Row_Name en utilisant le mappage:
la source
Une autre façon de remplacer les étiquettes de colonne d'origine est de supprimer les caractères indésirables (ici «$») des étiquettes de colonne d'origine.
Cela aurait pu être fait en exécutant une boucle for sur df.columns et en ajoutant les colonnes supprimées à df.columns.
Au lieu de cela, nous pouvons le faire proprement dans une seule déclaration en utilisant la compréhension de liste comme ci-dessous:
(la
strip
méthode en Python supprime le caractère donné du début et de la fin de la chaîne.)la source
Très simple à utiliser
et il attribuera les noms des colonnes par l'ordre dans lequel vous les avez mis
la source
Vous pouvez utiliser
str.slice
pour cela:la source
df.columns.str[1:]
... probablement mieux à utiliser, c'est plus court et plus évident.Je sais que cette question et réponse a été mâchée à mort. Mais je m'en suis référé à l'inspiration pour l'un des problèmes que j'avais. J'ai pu le résoudre en utilisant des morceaux de différentes réponses, fournissant ainsi ma réponse au cas où quelqu'un en aurait besoin.
Ma méthode est générique dans laquelle vous pouvez ajouter des délimiteurs supplémentaires en séparant la
delimiters=
variable par une virgule et en la rendant pérenne.Code de travail:
Production:
la source
Notez que ces approches ne fonctionnent pas pour un MultiIndex. Pour un MultiIndex, vous devez faire quelque chose comme ceci:
la source
Une autre option consiste à renommer à l'aide d'une expression régulière:
la source
Si vous devez gérer des charges de colonnes nommées par le système fournisseur 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 à l'aide d'expressions regex afin de jeter certaines annexes 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.
Ceci est ensuite appliqué à la trame de données en une seule fois.
la source
En plus de la solution déjà fournie, vous pouvez remplacer toutes les colonnes pendant que vous lisez le fichier. Nous pouvons utiliser
names
etheader=0
pour cela.Tout d'abord, nous créons une liste des noms que nous aimons utiliser comme noms de colonne:
Dans ce cas, tous les noms de colonne seront remplacés par les noms que vous avez dans votre liste.
la source
Voici une petite fonction astucieuse que j'aime utiliser pour réduire la frappe:
Voici un exemple de son fonctionnement:
la source
Renommer des colonnes dans les pandas est une tâche facile.
la source
En supposant que vous pouvez utiliser une expression régulière. Cette solution supprime le besoin d'encodage manuel à l'aide d'expressions régulières
la source