Ho un grande dataframe df
(~ 100 colonne e ~ 7 milioni di righe) e ho bisogno di creare ~ 50 nuove variabili/colonne che sono semplici trasformazioni delle variabili attuali. Un modo di procedere sarebbe stato con molte .apply
affermazioni (sto usando solo transform*
come segnaposto per le trasformazioni semplici come max
o squadratura):La maggior parte del modo Pythonic per creare molte nuove colonne in panda
df['new_var1'] = df['old_var1'].apply(lambda x : transform1(x))
...
df['new_var50'] = df['old_var50'].apply(lambda x : transform50(x))
Un altro modo sarebbe quello di creare prima un dizionario
transform_dict = {
'new_var1' : lambda row : transform1(row),
...,
'new_var50' : lambda row : transform50(row)
}
e poi scrivere una .apply
combinato con .concat
:
df = pd.concat([df,
df.apply(lambda r: pd.Series({var : transform_dict[var](r) for var in transform_dict.keys()}), axis=1)], axis=1)
I Un metodo preferito rispetto all'altro, sia per quanto "Pythonic" sia, per efficienza, scalabilità, flessibilità?
ci si aspetterebbe la seconda forma di essere più efficiente come primo metodo è iterativamente incrementando il df che significa molte riassegnazioni di memoria e la copia di dati come df cresce – EdChum
parte: 'applicare (riga lambda: transform1 (row)) 'è solo un modo più lento per scrivere' apply (transform1) '. – DSM