Rozważmy przykład, w którym to pandy mam kolumnę obliczeniową C
przez pomnożenie A
z B
i float
gdy pewien warunek jest spełniony przy użyciu apply
z lambda
funkcję:Pandy: jak szybciej wnioskować o ramkę danych?
import pandas as pd
df = pd.DataFrame({'A':[1,2,3,4,5,6,7,8,9],'B':[9,8,7,6,5,4,3,2,1]})
df['C'] = df.apply(lambda x: x.A if x.B > 5 else 0.1*x.A*x.B, axis=1)
Oczekiwany wynik będzie:
A B C
0 1 9 1.0
1 2 8 2.0
2 3 7 3.0
3 4 6 4.0
4 5 5 2.5
5 6 4 2.4
6 7 3 2.1
7 8 2 1.6
8 9 1 0.9
Problem polega na tym, że ten kod jest powolny i muszę wykonać tę operację na ramie danych z około 56 milionami wierszy.
%timeit
-result powyższej operacji lambda jest:
1000 loops, best of 3: 1.63 ms per loop
Idąc od czasu obliczeniowego, a także wykorzystanie pamięci, gdy robi to na moim dużym dataframe Przypuszczam, operacja ta wykorzystuje pośrednika serię robiąc obliczenia .
Próbowałem sformułować go na różne sposoby, w tym za pomocą kolumn tymczasowych, ale każde alternatywne rozwiązanie, które wymyśliłem, jest jeszcze wolniejsze.
Czy istnieje sposób na uzyskanie pożądanego wyniku w inny i szybszy sposób, np. za pomocą numpy
?
Należy spojrzeć na 'numpy.where'. – IanS