
Grupowanie, agregowanie, transformowanie danych jest to jedno z zadań które wykonuje bardzo często, każdy analityk danych. Nie jest więc zaskoczeniem, że i Pandas przychodzi tutaj z zestawem prostych, lecz skutecznych funkcji, takich jak pandas group by, sprawiając że jest to łatwe i przyjemne. W tej i kilku kolejnych lekcjach, pokaże najważniejsze z nich.
Dla zobrazowania działania funkcji group by, posłużymy się zbiorem danych films, który znamy z poprzednich lekcji.
films = pd.read_csv('https://analityk.edu.pl/wp-content/uploads/2020/12/film.csv', sep=';', encoding = "ISO-8859-1", skiprows=[1], dtype={'Length':'float64', 'Popularity':'float64'}, usecols=['Year','Length','Title','Subject','Popularity','Awards'], converters={'Awards':lambda x: True if x == 'Yes' else False})
Pandas Group by – prosty przykład
Powiedzmy że chcemy poznać ilość filmów w naszym DataFrame, dla poszczególnych lat. Użyjemy funkcji group by, która przyjmuje jako parametr nazwę kolumny po której chcemy dokonać grupowania oraz funkcji count() która zliczy nam rekordy:
films.groupby('Year').count()
Tym samym zliczyliśmy ile jest wartości w każdej kolumnie dla danego roku (innych niż NaN).
Bez problemu, możemy skupić się na jednej kolumnie, wykonać operację na przykład mean() i policzyć średnią popularność filmu:
films.groupby('Year').Popularity.mean()
Pandas Group by, dla kilku kolumn
Grupowanie może odbyć się również po większej ilości kolumn. Możemy policzyć średnią długość trwania filmu dla danego roku, dodatkowo w rozbiciu na np kategorię filmu. W tym celu do naszej funkcji group by, podamy 2 parametry:
films.groupby(['Year','Subject']).Length.mean()
Pandas Group by – funkcja agg
Powyżej zobaczyliśmy, że grupowanie dla prostych operacji jest bardzo proste w Pandas. A co jeżeli chcemy dla danej grupy wykonać kilka obliczeń? Np minimalną oraz maksymalną długość filmu oraz dodatkowo minimalną oraz maksymalną popularność filmu? Do tego celu użyjemy funcji agg, która znacząco zwiększa nasze możliwości.
Najpierw zobaczmy jak ona wygląda:
films.groupby('Year').agg({'Popularity':['min','max'], 'Length':['min','max']})
Funkcję możemy wywołać na kilka sposobów. W powyższym przykładnie wywołujemy ją ze słownikiem. Jak klucz podajemy kolumnę, a jako wartość, listę operacji którą chcemy wykonać. Innym sposobem wywołania funkcji agg, jest bardzo wygodny sposób, który pozwala nam od razu nadać nazwy naszym kolumnom:
films.groupby('Year').agg(mininalna_popularnosc=('Popularity','min'), maksymalna_popularnosc=('Popularity','max'))
Filtrowanie
Tak jak pokazłem powyżej, agregowanie w Pandas za pomocą funkcji group by jest proste. Magii brak, i po odrobinie ćwiczeń będzie Ci to bardzo dobrze wychodzić. To o czym jeszcze nie wspomniałem to o prostej metodzie na wyfiltrowanie części danych przed ich zgrupowaniem. Chociaż się możesz już domyślać jak to zrobić 🙂
Powiedzmy że chcemy policzyć średnią długość trwania filmu, dla filmów z okresu 1980 – 1990.
Na początku zamienimy rok na liczby, ponieważ zapomniałem tego zrobić we wcześniejszych lekcjach, a następnie użyjemy znanych i lubianych nawiasów [], aby wyfiltrować potrzebne dla nas dane.
films['Year'] = pd.to_numeric(films.Year) films[(films['Year'] >- 1980) & (films['Year'] <= 1990)].groupby('Year').Length.mean()
Proste? Proste!
Podsumowanie
Funkcja group by, jest czymś stosowanym bardzo często. Agg wymaga troszeczkę wprawy, ale szybko da się do jego składni przyzwyczaić. W kolejnych lekcjach zobaczymy dalsze transformacje, ale zanim tam przejdziemy, zapraszam do ćwiczeń.
Ćwiczenia
-
policz średni czas trwania filmu, w każdym roku, po 1980
-
policz ilość filmów, na dany roku, w zależności od kategorii filmu
Spis treści Pandas Tutorial / Kurs
- Pandas – Intro
- Pandas – przygotowanie środowiska pracy
- Pandas – tworzenie prostego DataFrame
- Pandas – odczyt i zapis do pliku
- Pandas – podstawowe informacje o DataFrame
- Pandas – indeksy oraz funkcja loc
- Pandas – maski
- Pandas – modyfikacje kolumn
- Pandas – funkcja apply
- Pandas – typy danych
- Pandas – grupowanie z groupby
- Pandas – unstack oraz tabele przestawne
- Pandas – łączenie zbiorów danych
- Pandas – SQL i bazy danych