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ść…
import pandas as pd df = pd.DataFrame( [ [-1, -1], [[11,12], [21, 22]], [-1,-1], [[101,102],[201,202]] ], columns=['rola','X_dist']) df
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:
def do_something(row): return pd.Series([row['rola'],'x','101'])
Jak wywołać tą funkcję? Tak:
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:
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