2016-06-29 54 views
5

Vorrei sapere se esiste una funzione per modificare nomi di colonne specifici ma senza selezionare un nome specifico o senza modificarli tutti.Modifica di più nomi di colonne ma non di tutti - Panda Python

ho il codice:

df=df.rename(columns = {'nameofacolumn':'newname'}) 

Ma con essa devo modificare manualmente ciascuno di loro a scrivere ogni nome. anche di cambiare tutti loro ho

df = df.columns['name1','name2','etc'] 

mi piacerebbe avere una funzione per modificare le colonne 1 e 3 senza scrivere i loro nomi solo affermando la loro posizione. Grazie!

+0

È possibile accedere alle colonne per indice, utilizzando 'df.columns [numero indice]'. –

risposta

4

È possibile utilizzare una comprensione dict e passare questo a rename:

In [246]: 
df = pd.DataFrame(columns=list('abc')) 
new_cols=['d','e'] 
df.rename(columns=dict(zip(df.columns[1:], new_cols)),inplace=True) 
df 

Out[246]: 
Empty DataFrame 
Columns: [a, d, e] 
Index: [] 

Funziona anche se si passa un elenco di posizioni ordinali:

df.rename(columns=dict(zip(df.columns[[1,2]], new_cols)),inplace=True) 
1

si dovrebbe essere in grado di fare riferimento alle colonne per indice utilizzando ..df.columns [indice]

>> temp = pd.DataFrame(np.random.randn(10, 5),columns=['a', 'b', 'c', 'd', 'e']) 
>> print(temp.columns[0]) 
    a 
>> print(temp.columns[1]) 
    b 

Quindi, per modificare il valore di colonne specifiche, prima di assegnare i valori da una matrice e modificare solo i valori che si desidera

>> newcolumns=temp.columns.values 
>> newcolumns[0] = 'New_a' 

assegnare il nuovo array di nuovo alle colonne e avrete quello che vi serve

>> temp.columns = newcolumns 
>> temp.columns 
>> print(temp.columns[0]) 
    New_a 
7

che tu abbia un dizionario dei nuovi nomi di colonna e il nome della colonna che dovrebbero sostituire:

df.rename(columns={'old_col':'new_col', 'old_col_2':'new_col_2'}, inplace=True) 

Ma, se non si dispone di questo, e hai solo gli indici, è possibile A questo scopo:

column_indices = [1,4,5,6] 
new_names = ['a','b','c','d'] 
old_names = df.columns[column_indices] 
df.rename(columns=dict(zip(old_names, new_names)), inplace=True) 
+0

Nella mia domanda ho già inserito quel codice ma ho detto che non era quello che volevo perché non volevo scegliere le colonne per nome ma per posizione. Grazie comunque! –

+0

@ AntonioLópezRuiz - ah, capito - Penso che la mia modifica ora risponda alla tua domanda. – mgoldwasser

+0

Lo fa! Grazie! –

1

Non è necessario utilizzare il metodo di rinomina.

È sufficiente sostituire i vecchi nomi di colonna con quelli nuovi utilizzando gli elenchi. Per rinominare colonne 1 e 3 (con indice 0 e 2), si fa qualcosa di simile:

df.columns.values[[0, 2]] = ['newname0', 'newname2']

o, eventualmente, se si utilizza la versione precedente di panda di 0.16.0, si fa:

df.keys().values[[0, 2]] = ['newname0', 'newname2']

il vantaggio di questo approccio è che non c'è bisogno di copiare l'intero dataframe con la sintassi df = df.rename, basta cambiare i valori di indice.