Pivot table (czyli tabela przestawna) jest wielu osobom dobrze znane z Excela. Pandas nie pozostaje z tyłu w tym temacie. W tej lekcji pokażę czym pivot table różni różni się od grupowania, które robiliśmy za pomocą funkcji group by i jak ją zrobić. Zaczynajmy!
Zbiór który weźmiemy pod lupę jest tym samym z którego korzystaliśmy przy grupowaniu, tak więc nie będę się rozpisywać na jego temat.
import pandas as pd 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', 'Year':'float64'}, usecols=['Year','Length','Title','Subject','Popularity','Awards'], converters={'Awards':lambda x: True if x == 'Yes' else False}) films.head()
Grupowanie dwóch kolumn, z group by
Zanim przejdziemy do pivot tables, spójrzmy na jeden przypadek. Mianowicie powiedzmy że chcemy pogrupować dane po dwóch kolumnach. Niech to będzie Year oraz Subject. Dla każdej grupy chcemy policzyć średnią popularność:
films.groupby(['Year','Subject']).agg(avg_popularity = ('Popularity','mean'))
W rezultacie otrzymujemy tabelę która wygląda tak jak powyżej. Zaraz do niej wrócimy.
Czym jest pivot table?
Pivot table, czyli tak zwana tabela przestawna, jest odmianą tabeli, którą otrzymujemy w wyniku grupowania, różniącą się innym układem kolumn.
Różnica polega na tym, że wybrana przez nas kolumna, zamienia się w szereg kolumn. W naszym przypadku, możemy zamienić naszą tabelę tak, aby kolumna zawierająca kategorię filmu stworzyła szereg kolumn, gdzie każda będzie odpowiadać konkretnej kategorii. Zobaczmy:
Pivot table z funkcją unstack()
Najprostszym sposobem utworzenia pivot table, jest zastosowanie funkcji unstack() na naszym wynikowym zbiorze grupowania:
x = films.groupby(['Year','Subject']).agg(avg_popularity = ('Popularity','mean')) x.unstack()
Druga kolumna w naszym zbiorze wynikowym z group by, utworzyła kilka kolumn. Są to dokładnie te same wynik co wcześniej, jednak inaczej przedstawione. O wiele, wiele czytelniej. Możemy wzrokiem w łatwy sposób przeglądać dane po roku, jak i po kategorii. Co było bardzo trudne w przypadku kiedy mieliśmy sam wynik grupowania.
Magii brak, natomiast czytelność się drastycznie zwiększyła. Stąd też popularność tabel przestawnych.
Pandas Pivot table, z funkcją…. pivot_table()
Biblioteka Pandas dostarcza również dedykowaną funkcję do tego celu, która przyjmuje kilka nowych parametrów, takich jak:
- index – czyli która kolumna ma być po lewej stronie w wierszach, jako nasz index
- columns – która kolumna ma utworzyć szereg nowych kolumn, na górze
- values – wynik operacji na której kolumnie ma byś widoczny 'wewnątrz’ naszej tabeli przestawnej
- aggfunc – jaką operację chcemy przeprowadzić – mean, sum, count, max, min itp
Najprostsza postać wywołania tej funkcji, może wyglądać tak:
pd.pivot_table(films, index='Year', columns='Subject', values='Popularity', aggfunc='mean')
I dać nam dokładnie takie same wyniki jak funkcje group_by() oraz unstack()
Pandas GroupBy + unstack vs pivot_table
No dobra. To skoro mamy conajmniej 2 metody tworzenia tabel przestawnych, to którą mam stosować?
Tą którą Ci wygodniej. Osobiście, w większości przypadków stosuje groupby + unstack? Why? Ponieważ łatwiej mi wykonać operacje dodatkowe na tabeli będącej wynikiem grouby, a na samym końcu zamieniań na pivot table.
Przykładowo. Trzymajmy się policzenia średniej popularności dla filmów per kategoria. Jeżeli popularność jest większa niż 60, to chciałbym zamiast wartości wstawić 'Bardzo popularny’, natomiast jak jest mniej punktów to wstawić 'Niszowy’. Moje rozwiązanie przy użyciu groupby było by takie:
x = films.groupby(['Year','Subject']).agg(avg_popularity = ('Popularity','mean')) x = x.avg_popularity.apply(lambda x: 'Bardzo popularny' if x > 60 else 'Niszowy') x.unstack(fill_value='')
Dla mnie, zrobienie pivota jest ostanim elementem. Ale to już być może kwestia gustu.
Podsumowując nasze pivot_table czyli table przestawne w Python Pandas
Tabela przestawna może być wynikiem prostego zabiegu na wyniku grupowania, lub też efektem użycia funkcji pivot_table. Jak komu wygodniej. Wyniki są takie same. Na koniec końców liczy się poprawność danych oraz atrakcyjny przekaz, który jest mocno związany z czytelnością.
Ćwiczenia z dataframe pivot table
-
Wyświetlić tabęlę z Kategoriami filmu w wierszach, informację o zdobytej nagronie w kolumnach, natomiast w komórkach z ilością zdobytych nagród
-
policzyć ilość filmów, dla roku oraz 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