Kiedy robisz rzeczy standardowe, korzystasz sobie ze standardowych metod, ale kiedy przychodzi zmierzyć się z niestandardowym problemem, to trzeba sięgnąć po funkcję apply.
Tutaj mamy dosyć nietypowy DataFrame. Dla każdego wiersza DataFrame trzeba wykonać jakąś niestandardową czynność…
1 2 3 4 5 6 7 8 9 10 11 |
import pandas as pd df = pd.DataFrame( [ [-1, -1], [[11,12], [21, 22]], [-1,-1], [[101,102],[201,202]] ], columns=['rola','X_dist']) df |
1 2 3 4 5 |
rola X_dist 0 -1 -1 1 [11, 12] [21, 22] 2 -1 -1 3 [101, 102] [201, 202] |
Dajmy na to, że w zależności od zawartości kolumny „rola” trzeba zwrócić taki albo inny DataFrame – ogólnie wykonać jakąś złożoną operację. W tym celu zdefiunujemy funkcję. Pisząc ją myśl, jakby miała pracować na wierszu z DataFrame. Do dyspozycji masz zmienną row, możesz się odwoływać do niej, jak do wiersza danych, sprawdzać wartości, pobierać dane, budować if, while – cokolwiek. Funkcja ta może zwracać nowy obiekt Series:
1 2 3 |
def do_something(row): return pd.Series([row['rola'],'x','101']) |
Jak wywołać tą funkcję? Tak:
1 |
df.apply(do_something, axis=1) |
Istotne jest wskazanie argumentem axis, że funkcja ma być stosowana do każdego wiesza, bo domyślnie apply wywołuje funkcję dla kolumn. Oto wynik:
1 2 3 4 5 |
0 1 2 0 -1 x 101 1 [11, 12] x 101 2 -1 x 101 3 [101, 102] x 101 |
Ten wynik można zapisać do innego DataFrame, czy właściwie zrobić z nim, co tam się chce 🙂
Funkcja apply – stosuj w przypadkach niestandardowych