Mam dużą ramkę danych df
(~ 100 kolumn i ~ 7 milionów wierszy) i potrzebuję utworzyć ~ 50 nowych zmiennych/kolumn, które są prostymi przekształceniami bieżących zmiennych. Jednym ze sposobów, aby przejść byłoby z wielu .apply
sprawozdania (jestem tylko przy użyciu transform*
jako zastępczy dla prostych przekształceń, takich jak max
lub płytowe):Najbardziej Pythoniczny sposób tworzenia wielu nowych kolumn w pandach
df['new_var1'] = df['old_var1'].apply(lambda x : transform1(x))
...
df['new_var50'] = df['old_var50'].apply(lambda x : transform50(x))
Innym sposobem byłoby najpierw utworzyć słownik
transform_dict = {
'new_var1' : lambda row : transform1(row),
...,
'new_var50' : lambda row : transform50(row)
}
i napisać .apply
połączeniu z .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 s jedna metoda preferowana w stosunku do drugiej, czy to "Python", czy efektywność, skalowalność, elastyczność?
spodziewałbym druga forma jest bardziej efektywne jak pierwsza metoda jest iteracyjnie zwiększając DF która będzie oznaczać wiele realokacje pamięci i kopiowanie danych, jak DF rośnie – EdChum
marginesie: 'Zastosuj (lambda wiersz: transform1 (row)) 'jest po prostu wolniejszym sposobem zapisu' apply (transform1) '. – DSM