Come posso rinominare una colonna specifica in Panda?
Da v0.24 +, per rinominare una (o più) colonne alla volta,
Se devi rinominare TUTTE le colonne contemporaneamente,
DataFrame.set_axis()
metodo con axis=1
. Passa una sequenza simile a un elenco. Sono disponibili anche opzioni per modifiche sul posto.
rename
con 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
Con 0.21+, ora puoi specificare un axis
parametro con 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
(Si noti che rename
non è sul posto per impostazione predefinita, quindi sarà necessario assegnare nuovamente il risultato .)
Questa aggiunta è stata apportata per migliorare la coerenza con il resto dell'API. Il nuovo axis
argomento è analogo al columns
parametro: fanno la stessa cosa.
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
accetta anche un callback che viene chiamato una volta per ogni colonna.
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
Per questo scenario specifico, si desidera utilizzare
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Simile al replace
metodo delle stringhe in python, Index panda e Series (solo tipo dtype) definiscono un str.replace
metodo ("vettoriale") per la sostituzione basata su stringhe e regex.
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
Il vantaggio di questo rispetto agli altri metodi è che str.replace
supporta regex (abilitato per impostazione predefinita). Consulta i documenti per ulteriori informazioni.
Passando un elenco a set_axis
conaxis=1
Chiama set_axis
con un elenco di intestazioni. L'elenco deve essere uguale in lunghezza alla dimensione di colonne / indice. set_axis
muta il DataFrame originale per impostazione predefinita, ma puoi specificare inplace=False
di restituire una copia modificata.
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
Nota: nelle versioni future, l' inplace
impostazione predefinita è True
.
Metodo di concatenamento
Perché scegliere set_axis
quando abbiamo già un modo efficiente di assegnare colonne df.columns = ...
? Come mostrato da Ted Petrou in [questa risposta], ( https://stackoverflow.com/a/46912050/4909087 ) set_axis
è utile quando si tenta di concatenare i metodi.
Confrontare
# new for pandas 0.21+
df.some_method1()
.some_method2()
.set_axis()
.some_method3()
Contro
# old way
df1 = df.some_method1()
.some_method2()
df1.columns = columns
df1.some_method3()
Il primo è una sintassi più naturale e a flusso libero.