Python, PANDAS: Jak wywoływać funkcję apply() dla każdego wiersza DataFrame

21-gru-2019

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

Komentarze są wyłączone

Autor: Rafał Kraik