Pandas to podstawowe narzędzie do analizy danych w Pythonie. Pokazuję od instalacji po pierwszą realną analizę, krok po kroku.
Efekt kilkunastu linii kodu w pandas: przychód według kategorii i miesięczny trend sprzedaży. Do tego dojdziemy w tym artykule, pracując na jednym pliku CSV.
Pandas to najpopularniejsza biblioteka Pythona do pracy z danymi w formie tabel. Wczytuje pliki CSV, Excela czy dane z bazy, pozwala je filtrować, grupować i liczyć, a na końcu narysować wykres - wszystko w kilku czytelnych liniach. W tym artykule zainstalujemy pandas od zera, a potem na prawdziwym zbiorze sprzedaży sklepu internetowego przejdziemy przez całą ścieżkę: od wczytania danych, przez filtrowanie i grupowanie, aż po gotowy wykres do raportu. Ten sam plik i ten sam kod odtworzysz u siebie w kilka minut - dane są do pobrania niżej.
Jeśli Pythona dopiero zaczynasz, warto najpierw zajrzeć do naszego bezpłatnego kursu Python od podstaw, a potem wrócić tutaj. Do przejścia przez ten artykuł wystarczy jednak podstawowa znajomość języka.
Z tego artykułu dowiesz się:
- jak zainstalować pandas przez pip i sprawdzić, że działa
- czym jest DataFrame i jak wczytać dane z pliku CSV
- jak filtrować, grupować i liczyć na prawdziwych danych sprzedaży
- jak zamienić wynik w wykres, który trafi do raportu
- czym jest Anaconda i kiedy wybrać ją zamiast pip
Pobierz dane do ćwiczeńPlik sprzedaz_sklep_internetowy.csv - 4300 zamówień sklepu z lat 2024-2025 (kategoria, produkt, miasto, ilość, cena). Dokładnie ten sam plik widzisz na wszystkich zrzutach poniżej. Zapisz go w folderze, z którego będziesz uruchamiać Pythona.
Czym jest pandas i najważniejsze pojęcie: DataFrame
Pandas dodaje do Pythona jeden kluczowy obiekt: DataFrame, czyli dwuwymiarową tabelę z nazwanymi kolumnami i ponumerowanymi wierszami - tak jak arkusz w Excelu, tylko sterowany kodem. Pojedyncza kolumna DataFrame to obiekt Series. Każda kolumna ma swój typ danych, po angielsku dtype (skrót od data type): liczby całkowite, liczby z przecinkiem, tekst albo daty. Ten typ decyduje o tym, co można z kolumną zrobić - na liczbach policzysz średnią, a z daty wyciągniesz miesiąc.
Anatomia DataFrame: kolumny mają nazwy i typy (dtype), wiersze mają indeks (etykiety 0, 1, 2...). Jedna kolumna to obiekt Series.
Cała reszta pandas sprowadza się do operacji na tym obiekcie: wybierz kolumny, odfiltruj wiersze, pogrupuj, policz, narysuj. Zobaczmy to na żywym przykładzie, ale najpierw zainstalujmy bibliotekę.
Instalacja pandas przez pip
Zakładamy, że masz zainstalowanego Pythona w wersji 3.9 lub nowszej. Jeśli jeszcze nie, przeprowadzi Cię przez to nasz wpis Instalacja Pythona i PyCharma. Mając Pythona, pandas instalujesz jednym poleceniem w terminalu (w Windowsie to Wiersz polecenia lub PowerShell, na macOS i Linuksie - Terminal):
Kopiuj
pip install pandas
Instalacja pandas przez pip. Menedżer pakietów sam dociąga zależności (m.in. numpy) i kończy komunikatem Successfully installed.
Na macOS i Linuksie polecenie brzmi często pip3 install pandas, bo samo pip może wskazywać na starego Pythona 2. Dobrym nawykiem jest tworzenie osobnego środowiska wirtualnego (po angielsku virtual environment) dla każdego projektu. To odizolowany katalog z własnym kompletem bibliotek, dzięki któremu projekty nie mieszają sobie wersji pakietów:
Kopiuj
python -m venv .venv
# Windows:
.venv\Scripts\activate
# macOS / Linux:
source .venv/bin/activate
pip install pandas
Kopiuj
Po instalacji warto sprawdzić, czy wszystko działa. Uruchamiamy Pythona i importujemy pandas. Przyjęło się skracać nazwę do pd - zobaczysz ten zapis w każdym przykładzie w sieci:
Kopiuj
python -c "import pandas as pd; print(pd.__version__)"
Sprawdzenie, że pandas działa: import biblioteki i odczyt numeru wersji. Jeśli nie widzisz błędu, możemy zaczynać analizę.
Wczytanie danych - pierwszy DataFrame
Pracujemy na pliku sprzedaz_sklep_internetowy.csv (jeśli jeszcze go nie masz, pobierz go tutaj). To 4300 zamówień fikcyjnego sklepu z elektroniką: data zamówienia, kategoria, produkt, miasto, kanał sprzedaży, ilość i cena jednostkowa. Wczytujemy plik funkcją read_csv i od razu oglądamy pierwsze wiersze metodą head. Parametr parse_dates mówi pandas, żeby kolumnę z datą potraktował jako datę, a nie zwykły tekst:
Kopiuj
import pandas as pd
df = pd.read_csv("sprzedaz_sklep_internetowy.csv", parse_dates=["data"])
df.head()
Kopiuj
Metoda head() pokazuje pierwsze pięć wierszy. Widać wszystkie kolumny i pierwsze zamówienia - dane wczytały się poprawnie.
Kod uruchamiamy w notatniku Jupyter, dlatego ostatnia linia komórki od razu wyświetla ładnie sformatowaną tabelę. W zwykłym skrypcie dopisałbyś print(df.head()). O Jupyterze więcej w części o Anacondzie.
Ile w ogóle mamy danych? Atrybut shape zwraca liczbę wierszy i kolumn:
Kopiuj
df.shape
shape zwraca parę liczb: 4300 wierszy i 8 kolumn. Pierwsza liczba to zawsze liczba wierszy.
Zanim cokolwiek policzymy, warto poznać strukturę tabeli. Metoda info wypisuje listę kolumn, liczbę niepustych wartości i typ danych każdej kolumny:
Kopiuj
df.info()
info() to pierwszy raport o danych: nazwy kolumn, brak braków (4300 wartości wszędzie) oraz typy - liczby, tekst (str) i data (datetime64).
Zwróć uwagę na typy danych: data jest typu datetime64 (dzięki parse_dates), ceny to float64 (liczby z przecinkiem), a nazwy to str (tekst). Gdyby data była zwykłym tekstem, nie moglibyśmy wyciągnąć z niej miesiąca ani zrobić wykresu w czasie.
Szybkie podsumowanie liczb metodą describe
Jedno polecenie daje komplet statystyk dla wszystkich kolumn liczbowych: średnią, odchylenie standardowe, wartości minimalną i maksymalną oraz kwartyle. Metoda round zaokrągla wynik dla czytelności:
Kopiuj
df.describe().round(2)
describe() liczy statystyki jednym poleceniem. Widać między innymi średnią cenę jednostkową i najdroższe zamówienie w całym zbiorze.
To bezcenne przy pierwszym kontakcie z danymi. Od razu widać zakres cen, typową ilość w zamówieniu i to, czy nie ma podejrzanych wartości, na przykład ujemnych. Wiersz 50% to mediana, czyli wartość środkowa - odporniejsza na pojedyncze bardzo drogie zamówienia niż zwykła średnia.
Wybieranie kolumn i filtrowanie wierszy
Pojedynczą kolumnę wybierasz przez df["nazwa"], a kilka kolumn naraz przez listę nazw w podwójnych nawiasach kwadratowych:
Kopiuj
df[["produkt", "cena_jedn"]].head()
Wybranie dwóch kolumn: produkt i cena jednostkowa. Podwójne nawiasy kwadratowe oznaczają listę kolumn do pokazania.
Najczęstsza operacja to jednak filtrowanie wierszy po warunku. Zapis w środku nawiasu (df["cena_jedn"] > 5000) tworzy tak zwaną maskę logiczną, czyli kolumnę wartości prawda albo fałsz dla każdego wiersza. Pandas zwraca tylko te wiersze, dla których warunek jest prawdziwy:
Kopiuj
df[df["cena_jedn"] > 5000].head()
Filtr po warunku: tylko zamówienia droższe niż 5000 zł za sztukę. To najczęściej używana operacja w codziennej analizie danych.
Warunki można łączyć operatorami & (i) oraz | (lub), pamiętając o nawiasach wokół każdego z nich, na przykład df[(df["kategoria"] == "Laptopy") & (df["ilosc"] > 1)]. Do precyzyjnego wskazywania wierszy i kolumn służą też df.loc (po etykietach) oraz df.iloc (po numerach pozycji).
Tworzenie nowej kolumny - przychód
W danych mamy ilość i cenę jednostkową, ale nie ma przychodu. Policzmy go. W pandas nie potrzeba do tego pętli - mnożymy dwie kolumny naraz, a wynik trafia do nowej kolumny. To tak zwana wektoryzacja: operacja wykonuje się od razu na całej kolumnie, dzięki czemu zapis jest krótki, a obliczenie bardzo szybkie. Do podglądu wybieramy zamówienia z ilością większą niż 1, żeby od razu było widać efekt mnożenia:
Kopiuj
df["przychod"] = df["ilosc"] * df["cena_jedn"]
df[df["ilosc"] > 1][["produkt", "ilosc", "cena_jedn", "przychod"]].head()
Nowa kolumna przychód powstaje z pomnożenia dwóch istniejących kolumn. Na zamówieniach z ilością większą niż 1 wyraźnie widać, że przychód to ilość razy cena jednostkowa.
Sortowanie i największe zamówienia
Które zamówienia były największe? Metoda nlargest zwraca wiersze o najwyższej wartości wskazanej kolumny, tutaj dziesięć zamówień o najwyższym przychodzie. Na końcu wybieramy kilka kolumn, żeby wynik był czytelny:
Kopiuj
df.nlargest(10, "przychod")[["data", "produkt", "ilosc", "cena_jedn", "przychod"]]
Dziesięć największych zamówień według przychodu. Na szczycie drogie laptopy kupowane po dwie sztuki. Ogólne sortowanie robi metoda sort_values.
Grupowanie - serce analizy (groupby)
Najciekawsze pytania dotyczą grup: która kategoria zarabia najwięcej, które miasto kupuje najchętniej. Służy do tego groupby, które działa według schematu podziel, policz, połącz (po angielsku split-apply-combine): pandas dzieli dane na grupy według wskazanej kolumny, w każdej grupie wykonuje obliczenie (tu sumę przychodu), a potem składa wyniki w jedną tabelę. Na koniec sortujemy malejąco:
Kopiuj
przychod_kat = df.groupby("kategoria")["przychod"].sum().sort_values(ascending=False)
przychod_kat
groupby sumuje przychód w każdej kategorii. Widać od razu, że Laptopy i Smartfony odpowiadają za większą część obrotu.
Liczby robią wrażenie, ale wykres przekonuje szybciej. Pandas ma wbudowane rysowanie - metoda plot na naszym wyniku tworzy gotowy wykres słupkowy. Parametr kind="barh" to słupki poziome, a color ustawia ich kolor:
Pierwszy wykres wprost z danych
Kopiuj
przychod_kat.sort_values().plot(kind="barh", color="#E02D33",
title="Przychód wg kategorii", xlabel="przychód [zł]");
Ten sam wynik jako wykres słupkowy - kilka słów w wywołaniu plot() i mamy gotowy obraz do raportu. Laptopy na czele.
Średnik na końcu linii to drobiazg z notatnika Jupyter - ukrywa techniczny komunikat o obiekcie wykresu. W zwykłym skrypcie dopisz na górze import matplotlib.pyplot as plt, a na dole plt.show(), żeby okno z wykresem się pojawiło. Pandas rysuje przy pomocy biblioteki matplotlib, którą instaluje się tak samo prosto: pip install matplotlib.
Chcesz przejść od pojedynczych analiz do sprawnej, codziennej pracy z danymi w Pythonie pod okiem praktyka? Szkolenie Analiza danych w języku Python ma terminy gwarantowane.
Ile zamówień w każdej kategorii - value_counts
Uwaga na pułapkę: największy przychód nie znaczy najwięcej zamówień. Metoda value_counts zlicza, ile razy występuje każda wartość w kolumnie:
Kopiuj
df["kategoria"].value_counts()
value_counts liczy zamówienia w kategoriach. Akcesoria mają ich najwięcej, choć w przychodzie były na ostatnim miejscu.
To jest właśnie ten moment, dla którego robi się analizę danych. Akcesoria to najczęstsze zamówienia, ale najniższy przychód - dużo tanich transakcji. Z laptopami jest odwrotnie: mało zamówień, ale każde wysokie. Bez zestawienia tych dwóch liczb łatwo o złą decyzję, na przykład o promowaniu nie tej kategorii, co trzeba.
Tabela przestawna - pivot_table
Jeśli znasz tabele przestawne z Excela, poczujesz się jak w domu. pivot_table rozkłada jedną wartość na dwa wymiary. Sprawdźmy przychód w układzie kategoria (wiersze) wobec kanału sprzedaży (kolumny). Parametr margins=True dodaje wiersz i kolumnę z sumami:
Kopiuj
pd.pivot_table(df, values="przychod", index="kategoria",
columns="kanal", aggfunc="sum", margins=True).round(0)
Tabela przestawna: kategoria wobec kanału sprzedaży. Kolumna All to suma dla każdej kategorii, a wiersz All - dla każdego kanału.
Analiza w czasie - trend miesięczny (resample)
Skoro kolumna z datą ma typ daty, możemy łatwo agregować po czasie. Ustawiamy datę jako indeks, a metoda resample grupuje dane w równe przedziały czasu. Tutaj "ME" oznacza końce kolejnych miesięcy (od angielskiego month end). Sumujemy przychód i od razu rysujemy:
Kopiuj
miesiecznie = df.set_index("data").resample("ME")["przychod"].sum()
miesiecznie.plot(marker="o", color="#E02D33",
title="Miesięczny przychód", xlabel="", ylabel="przychód [zł]");
Miesięczny przychód na wykresie liniowym. Najwyższe słupki wypadają na przełomie roku (Black Friday i sezon świąteczny), a zaraz po nich, w styczniu i lutym, przychód gwałtownie spada.
Jednym spojrzeniem widać sezonowość: pod koniec roku sprzedaż wystrzeliwuje w górę - najwyższy słupek na całym wykresie to grudzień, a zaraz po nim, w styczniu i lutym, przychód gwałtownie spada. Taka informacja jest warta realnych pieniędzy - podpowiada, kiedy zwiększyć zapasy i budżet reklamowy. A wyciągnęliśmy ją z surowego pliku CSV w kilku liniach kodu.
Anaconda - gdy chcesz wszystko w jednym pakiecie
Do tej pory instalowaliśmy pandas przez pip. Jest jednak druga popularna droga: Anaconda. To gotowa dystrybucja Pythona przeznaczona do analizy danych i pracy naukowej. W jednym instalatorze dostajesz Pythona oraz komplet bibliotek - pandas, numpy, matplotlib - a także notatnik Jupyter i własny menedżer pakietów o nazwie conda. Nie musisz nic dobierać ręcznie.
pip i Anaconda prowadzą do tego samego pandas. pip jest lżejszy i standardowy, Anaconda daje komplet narzędzi od razu.
Różnica w praktyce sprowadza się do menedżera pakietów. Zamiast pip install używasz conda install, a osobne środowiska tworzysz poleceniem conda create. Conda potrafi sprawnie rozwiązać trudne zależności bibliotek kompilowanych, co bywa kłopotliwe przy czystym pip na Windowsie. Tak wygląda założenie nowego środowiska z pandas i Jupyterem oraz sprawdzenie wersji:
Kopiuj
conda create -n analiza_danych python=3.12 pandas jupyter
conda activate analiza_danych
conda list pandas
conda create zakłada izolowane środowisko i sam dobiera zgodne wersje pakietów. conda list pokazuje, że pandas jest gotowy do pracy.
Z Anacondą dostajesz też Jupyter Notebook - interaktywne środowisko, w którym kod pisze się w komórkach uruchamianych po kolei, a wynik (tabela albo wykres) pojawia się od razu pod komórką. To dlatego wszystkie zrzuty w tym artykule wyglądają tak, a nie jak wydruk z terminala. Jupyter uruchomisz z poziomu Anaconda Navigator (graficznego menu dystrybucji) albo poleceniem jupyter notebook:
Notatnik Jupyter w akcji: po lewej kod, pod nim od razu wynik. Każdą komórkę uruchamiasz osobno, budując analizę krok po kroku.
Które podejście wybrać? Jeśli dopiero zaczynasz i chcesz tylko pobawić się danymi, pip install pandas w zupełności wystarczy. Jeśli planujesz poważniej wejść w analizę danych i uczenie maszynowe, Anaconda oszczędzi Ci sporo instalowania i konfiguracji. Jednej zasady warto pilnować: w obrębie jednego środowiska nie mieszaj pip i conda, bo łatwo wtedy o konflikt wersji.
Co dalej
Masz już komplet podstaw: instalacja, wczytywanie danych, filtrowanie, grupowanie, tabele przestawne i wykresy. To fundament, na którym stoi cała analiza danych i uczenie maszynowe w Pythonie. Kolejne naturalne kroki to numpy (obliczenia na tablicach liczb), ładniejsze wykresy w matplotlib i seaborn, a potem scikit-learn - biblioteka do budowania modeli uczenia maszynowego, która dane wejściowe przyjmuje właśnie jako DataFrame z pandas. Gdy dane przestaną mieścić się na jednym komputerze, w grę wchodzą współczesne rozwiązania big data, w których składnia pandas wraca w narzędziach rozproszonych.
Najlepszy sposób na naukę to własne ćwiczenia. Pobierz plik z danymi, otwórz notatnik i spróbuj odpowiedzieć na własne pytania: które miasto kupuje najdrożej, jak wypada sprzedaż w poszczególnych kanałach, który produkt ma największy udział w swojej kategorii. Każda z tych odpowiedzi to jedno albo dwa polecenia, które już znasz.
Chcesz przejść od pandas do uczenia maszynowego z trenerem
Jeśli wolisz uczyć się w uporządkowany sposób i pracować na realnych projektach, prowadzimy szkolenie, które przechodzi całą tę ścieżkę: od podstaw Pythona, przez analizę danych w pandas, aż po pierwsze modele uczenia maszynowego. Kurs ma terminy gwarantowane, więc masz pewność, że grupa się odbędzie.
Szkolenie Python od podstaw do machine learning -->
NEWSLETTER
Nowe artykuły o Pythonie i danych prosto na maila
Co tydzień wysyłamy świeże poradniki z bloga JSystems. Bez spamu, wypisujesz się jednym kliknięciem.
Powiązane artykuły
- Bezpłatny kurs Python od podstaw
- Instalacja Pythona i PyCharma - konfiguracja środowiska krok po kroku
- LangChain RAG tutorial w Pythonie - krok po kroku
- Współczesne rozwiązania Big Data 2026 - Spark, lakehouse i streaming
- SQL vs. NoSQL - wielkie porównanie baz danych
- Czy AI zastąpi programistów? Oddzielamy dane od marketingu
Chcesz pogłębić temat na żywym szkoleniu z trenerem? Zobacz kurs Python from zero do Machine Learning w JSystems — termin gwarantowany.
Więcej zrzutów ekranu i przykładów: blog.jsystems.pl





















Top comments (0)