Modifica di un nome di colonna specifico in Panda DataFrame


195

Stavo cercando un modo elegante per cambiare il nome di una colonna specificata in a DataFrame.

riproduci dati ...

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 soluzione più elegante che ho trovato finora ...

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

Speravo in un semplice one-liner ... questo tentativo fallì ...

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

Eventuali suggerimenti ricevuti con gratitudine.

Risposte:


355

Una fodera esiste:

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

Di seguito è riportato il documento per il renamemetodo.

Definizione: df.rename (self, index = None, colonne = None, copy = True, inplace = False)
docstring:
Modificare l'indice e / o le colonne utilizzando la funzione di input o
funzioni. I valori di funzione / dettatura devono essere univoci (da 1 a 1). Etichette no
contenuto in un dict / Series verrà lasciato così com'è.

parametri
----------
indice: simil-simile o funzione, facoltativo
    Trasformazione da applicare ai valori di indice
colonne: simil-like o funzione, facoltativo
    Trasformazione da applicare ai valori di colonna
copia: booleano, impostazione predefinita True
    Copia anche i dati sottostanti
inplace: booleano, impostazione predefinita False
    Se restituire un nuovo DataFrame. Se True, il valore della copia è
    ignorato.

Guarda anche
--------
Series.rename

ritorna
-------
rinominato: DataFrame (nuovo oggetto)

Questo non funziona per me se non uso inplace = True come mostrato nella risposta @ Jeong-Yoon Lee.
JStrahl

108

Poiché l' inplaceargomento è disponibile, non è necessario copiare e assegnare il frame di dati originale a se stesso, ma procedere come segue:

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

39

Che dire?

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

11
in realtà non funziona se in seguito usi il nome della colonna su altre operazioni come in df ['new_name']
Master Yogurt

4
questa risposta mi è stata utile per cambiare una colonna specifica con un nuovo nome. La prima colonna è l'indice 0, la seconda colonna è l'indice 1 e così via. bella soluzione .. e sono sicuro che questo aiuterà più persone .. poiché le altre soluzioni richiedono di conoscere e copiare i nomi delle colonne originali in anticipo .... mentre questo è un metodo rapido e sporco .. che ha i suoi usi.
ihightower,

1
@MasterYogurt il tuo commento non è corretto. È possibile eseguire df['new_name'](e altre cose panda) dopo aver modificato le variabili come indicato sopra. Il tuo commento potrebbe essere stato valido al momento della pubblicazione originale.
Jacob H,

1
Detto questo, l'utilizzo dei renamemetodi è una soluzione migliore.
Jacob H,

6

Panda 0.21 ora ha un parametro axis

Il metodo rename ha acquisito un parametro axis per abbinare la maggior parte del resto dell'API panda.

Quindi, oltre a questo:

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

Tu puoi fare:

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

o

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

df.rename ({'two': 'new_name'}, axis = 'colonne') Genera TypeError: Impossibile specificare sia 'axis' che uno qualsiasi di 'index' o 'colonne'.
Ecco il

@HereHere Assicurati di essere sulla versione 0.21 di Panda. Fate pd.__version__controllare la versione
Ted Petrou

5

Se sai quale colonna # è (primo / secondo / nth), questa soluzione pubblicata su una domanda simile funziona indipendentemente dal fatto che sia denominata o senza nome e in una riga: 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

Per rinominare le colonne qui è quella semplice che funzionerà per entrambe Default(0,1,2,etc;)e colonne esistenti ma non molto utile per un set di dati più grande (con molte colonne).

Per un set di dati più grande possiamo suddividere le colonne di cui abbiamo bisogno e applicare il codice seguente:

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

2

Il seguente codice funzione può aiutare:

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

Rimuovi gli spazi dalle colonne.


Continuavo a ricevere, AttributeError: 'int' object has no attribute 'replace'potresti approfondire su questo.
Nirmal

2

Panda versione 0.23.4

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

Per il record:

omettendo index = str darà errore sostituisci ha un argomento imprevisto 'colonne'


1

Un'altra opzione sarebbe semplicemente copiare e rilasciare la colonna:

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

Dopo di che ottieni il risultato:

    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
Questo metodo non aiuta nel caso in cui l'ordine degli indici delle colonne sia importante. La nuova colonna verrà creata alla fine.
Loochie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.