Come aggiungere un suffisso (o prefisso) a ogni nome di colonna?


89

Voglio aggiungere il _xsuffisso a ogni nome di colonna in questo modo:

featuresA = myPandasDataFrame.columns.values + '_x'

Come faccio a fare questo? Inoltre, se volessi aggiungere x_come suffisso, come cambierebbe la soluzione?

Risposte:


124

Puoi usare una listcomprensione:

df.columns = [str(col) + '_x' for col in df.columns]

Ci sono anche metodi integrati come .add_suffix()e .add_prefix()come menzionato in un'altra risposta.


questa è la risposta più semplicistica ed elegante!
Jinhua Wang

165

Il seguente è il modo più carino per aggiungere il suffisso secondo me.

df = df.add_suffix('_some_suffix')

Poiché è una funzione che viene chiamata su DataFrame e restituisce DataFrame, puoi usarla nella catena delle chiamate.


14
Puoi usare add_prefix se vuoi aggiungere un prefisso ai nomi.
Jorge

9
Peccato che non possa essere modificabile (cioè non ha inplace=Trueun'opzione di parametro). Altrimenti, perfetto.
ijoseph

Penso che questa sia migliore della risposta accettata in alcune circostanze, perché può essere utilizzata in una catena di operazioni in una singola istruzione, piuttosto che necessitare della propria dichiarazione.
Capitano Lepton

@CaptainLepton quando non sarebbe questa risposta sia migliore del accettato risposta
Baxx

1
Se il suffisso non è una costante. Il titolo parla di suffissi. Il post restringe l'ambito a un singolo suffisso costante, ma se stiamo rispondendo al titolo del post in termini generali, l'impostazione delle colonne tramite una lista di comprensione o altro iterabile è più flessibile
Capitano Lepton

18

Elegante concatenazione sul posto

Se stai cercando di modificare dfsul posto, l'opzione più economica (e più semplice) è l'aggiunta sul posto direttamente su df.columns(ovvero, utilizzando Index.__iadd__).

df = pd.DataFrame({"A": [9, 4, 2, 1], "B": [12, 7, 5, 4]})
df

   A   B
0  9  12
1  4   7
2  2   5
3  1   4

df.columns += '_some_suffix'
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Per aggiungere un prefisso, useresti in modo simile

df.columns = 'some_prefix_' + df.columns
df

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Un'altra opzione economica è usare una comprensione delle liste con f-stringformattazione (disponibile su python3.6 +).

df.columns = [f'{c}_some_suffix' for c in df]
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

E per il prefisso, allo stesso modo,

df.columns = [f'some_prefix{c}' for c in df]

Concatenamento di metodi

È anche possibile aggiungere * correzioni durante il concatenamento dei metodi. Per aggiungere un suffisso, usaDataFrame.add_suffix

df.add_suffix('_some_suffix')

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Ciò restituisce una copia dei dati. IOW, dfnon viene modificato.

Anche l'aggiunta di prefissi viene eseguita con DataFrame.add_prefix.

df.add_prefix('some_prefix_')

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Che inoltre non modifica df.


Critica di add_*fix

Questi sono buoni metodi se stai cercando di eseguire il concatenamento di metodi:

df.some_method1().some_method2().add_*fix(...)

Tuttavia, add_prefix(e add_suffix) crea una copia dell'intero dataframe, solo per modificare le intestazioni. Se ritieni che questo sia uno spreco, ma desideri comunque concatenare, puoi chiamare pipe:

def add_suffix(df):
    df.columns += '_some_suffix'
    return df

df.some_method1().some_method2().pipe(add_suffix)

Questo è elegante! Cosa succede se si desidera aggiungere un prefisso o un suffisso a un sottoinsieme delle colonne, ad esempio le colonne i cui nomi contengono tutti una parola comune (come newo old) invece di ogni colonna? Grazie.
Bowen Liu

1
@BowenLiu Suggerirei di andare con df.rename () invece ... Passa un dizionario che associa i nomi ai loro nuovi nomi. Quindi chiama rinomina con asse = 1. È inoltre possibile utilizzare l'assegnazione di comprensione dell'elenco condizionale.
cs95

Funziona solo con tipi di dati regolari come nomi di colonna, non se le tue colonne sono un RangeIndex come ad esempio df = pd.DataFrame([[1,2,3]]*10)-> df.columns, allora userestidf.add_suffix('_x')
questionto42

puoi fare df.columns = df.columns.astype(str) + '_x' come mostra il mio primo metodo.
cs95

4

Non ho visto questa soluzione proposta sopra, quindi aggiungendola all'elenco:

df.columns += '_x'

E puoi facilmente adattarti allo scenario del prefisso.


La migliore soluzione per il suffisso, anche se ovviamente non può essere utilizzato per il prefisso.
domanda al

Funziona solo con tipi di dati regolari nei nomi delle colonne, non se le colonne sono un RangeIndex come ad esempio df = pd.DataFrame([[1,2,3]]*10)-> df.columns, allora userestidf.add_suffix('_x')
questionto42

1

Conosco 4 modi per aggiungere un suffisso (o prefisso) ai nomi delle colonne:

1- df.columns = [str(col) + '_some_suffix' for col in df.columns]

o

2- df.rename(columns= lambda col: col+'_some_suffix')

o

3- df.columns += '_some_suffix'molto facile.

o, il più carino:

3- df.add_suffix('_some_suffix')


0

Utilizzando DataFrame.rename.

Ritiro di add_prefixeadd_suffix

Nelle versioni future di panda add_prefixe add_suffixsarà deprecato . Il nuovo metodo consigliato consiste nell'utilizzare DataFrame.rename:

df = pd.DataFrame({'A': range(3), 'B': range(4, 7)})
print(df)
   A  B
0  0  4
1  1  5
2  2  6

Utilizzando renamecon axis=1e la formattazione della stringa:

df.rename('col_{}'.format, axis=1)
# or df.rename(columns='col_{}'.format)

   col_A  col_B
0      0      4
1      1      5
2      2      6

Per sovrascrivere effettivamente i nomi delle colonne, possiamo assegnare i valori restituiti al nostro df:

df = df.rename('col_{}'.format, axis=1)

oppure usa inplace=True:

df.rename('col_{}'.format, axis=1, inplace=True)
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.