Artykuły | 9 sierpień, 2023

Biblioteki Python – Pandas. Poznaj możliwości analizy i przetwarzania danych 

Jak łatwo wczytywać, przetwarzać i analizować dane w Pythonie? Poznaj darmową bibliotekę w języku Python: Pandas.

Biblioteki Python – Pandas. Poznaj możliwości analizy i przetwarzania danych 

Pandas to darmowa biblioteka w języku Python, która w znaczny sposób rozszerza możliwości analizy i przetwarzania danych. Biblioteka ta jest jednym z najważniejszych narzędzi w środowisku Python. Używana jest powszechnie jako wsparcie w różnych obszarach przemysłu. Po przeczytaniu tego artykułu dowiesz się, jak łatwo wczytywać, przetwarzać i analizować dane w Pythonie. Ta umiejętność jest ceniona w wielu dziedzinach, od finansów po rozwiązywanie problemów inżynierskich.

Biblioteki Python: Pandas. Dlaczego warto ją poznać? 

Biblioteka została stworzona, aby ułatwić pracę z różnego rodzaju danymi, które nie zawsze są kompletne lub wymagają odpowiedniej obróbki w celu ich dalszego przetwarzania. Pandas dostarcza elastyczne i łatwe w użyciu struktury danych i narzędzia (chociaż nie zawsze wydajne, w dalszej części zdradzę, w jaki sposób sobie z tym poradzić). Obok takich bibliotek jak NumPy, Matplotlib, Seaborn czy Scikit-Learn przez wiele lat, biblioteka Pandas zapracowała na popularność i uznanie wśród kadry akademickiej, analityków, inżynierów i pasjonatów zainteresowanych pracą z danymi. 

Jest to idealne narzędzie do zarządzania danymi i analizowania ich (z pomocą dodatkowych bibliotek) w małych i średnich zbiorach. W przypadku zbiorów rozległych, popularnych w obszarze związanym z Big Data, przetwarzanie jest możliwe, ale wraz ze wzrostem ilości danych, rośnie prawdopodobieństwo problemów z pamięcią i wydajnością. 

Kiedy sprawdzi się biblioteka Pandas? 

Biblioteka Pandas jest dobrze przystosowana do pracy z wykorzystaniem różnych typów i źródeł danych: 

  • Tablicowe dane z kolumnami różnego typu (np. Excel, SQL
  • Szeregi czasowe (time-series
  • Dane z etykietami wierszy i kolumn (labeled data

Przykładowe zastosowania biblioteki Pandas

Oto kilka przykładów zastosowań biblioteki Pandas: 

  • Wczytywanie różnych formatów danych (CSV, Excel, SQL, pliki płaskie itd.) 
  • Filtrowanie, sortowanie i inne operacje z danymi 
  • Czyszczenie danych (usuwanie wartości NaN Not a Number), uśrednianie, zastępowanie wartości itp.) 
  • Szybkie i efektywne obliczanie statystyk i przeprowadzanie operacji na danych 
  • Wizualizacja danych za pomocą wykresów 

Zanim zaczniemy korzystać z biblioteki Pandas, upewnijmy się, że jest ona zainstalowana w środowisku Python. 

Jak zainstalować Pandas? 

Instalacja Pandas jest bardzo prosta i może zostać wykonana za pomocą narzędzia pip, które jest domyślnym menedżerem pakietów Python. Zakładam, że Python jest już zainstalowany na twoim komputerze, a jeżeli nie – tutaj jest instrukcja, jak to zrobić.  

Następnie wystarczy otworzyć terminal i wpisać poniższą komendę: 

pip install pandas

Możliwe, że będzie wymagane nadanie uprawnień do wykonania tej komendy (np. przy użyciu sudo na systemach Unixowych lub uruchamiając terminal z prawami administratora w systemie Windows), a w przypadku korzystania z konkretnego wirtualnego środowiska Python (np. venv lub conda), konieczne będzie aktywowanie tego środowiska przed zainstalowaniem pakietu. Więcej o wirtualnych środowiskach przeczytasz w dokumentacji.

Jeżeli używasz Anacondy, możesz zainstalować Pandas za pomocą polecenia: 

conda install pandas

Jak zaimportować Pandas do swojego projektu? 

Gdy biblioteka Pandas jest już zainstalowana, możemy zacząć z niej korzystać. Pierwszym krokiem jest zaimportowanie biblioteki do naszego skryptu lub projektu. Import biblioteki Pandas nie różni się niczym od jakiejkolwiek innej biblioteki w Pythonie. 

Możemy to zrobić za pomocą poniższego kodu: 

import pandas as pd

W Pythonie Pandas zazwyczaj importuje się pod aliasem ‘pd’, który jest krótkim i powszechnie przyjętym skrótem. Teraz, kiedy chcemy użyć funkcji z biblioteki Pandas, zamiast wpisywać pełne słowo „pandas”, używamy skrótu „pd”. Analogicznie sytuacja wygląda w przypadku biblioteki NumPy (‘np’), o której pisałem w jednym z poprzednich artykułów.  

Przykładowo, jeśli chcielibyśmy stworzyć DataFrame (jedną z kluczowych struktur danych w Pandas), kod wyglądałby następująco: 

import pandas as pd

data = {

    'column_1': [3, 2, 0, 1],

    'column_2': [0, 3, 7, 2]

}

example_df = pd.DataFrame(data)

print(example_df)

Jak widać na powyższym przykładzie, użyłem klasy DataFrame, podstawowej struktury, którą udostępnia nam Pandas. W kolejnym rozdziale omówimy inne dwie podstawowe struktury danych – Series i DataFrame

Ramki danych i serie – Pandas DataFrame i Series 

Głównym celem biblioteki Pandas jest ułatwienie pracy z danymi, dlatego Pandas wprowadza dwie struktury danych: Series i DataFrame. Zrozumienie tych struktur jest kluczowe do efektywnego korzystania z tej biblioteki. 

Series 

Series to jednowymiarowa struktura danych, a właściwie tablicy (ndarray), podobna do listy lub kolumny w tabeli. Każdy element (np. liczby całkowite, listy, obiekty, tuple) w Series ma przypisany identyfikator, który nazywany jest indeksem. Series przechowuje dane jednego typu. 

Przykładowo, stworzenie Series, który zawiera listę elementów, może wyglądać tak: 

import pandas as pd

vals_sr = pd.Series(["Val_1", "Val_2", "Val_3", "Val_4", "Val_5"])

print(vals_sr)

Jeżeli chodzi o indeks, to domyślnie są to liczby całkowite (integer), zaczynając od zera. Indeks można zmienić, np. nadając etykiety. W takim przypadku należy rozszerzyć nasz kod odpowiedzialny za tworzenie Series. Służy do tego parametr index, a kod wygląda następująco: 

import pandas as pd

vals_sr = pd.Series(["Val_1", "Val_2", "Val_3", "Val_4", "Val_5"], index=["A", "B", "C", "D", "E"])

print(vals_sr)

Warto pamiętać, że liczba “etykiet” powinna odpowiadać liczbie elementów w Series. W przeciwnym razie Python interpreter zwróci nam błąd (ValueError). Jeżeli nie chcesz wyświetlać całego Series, a jedynie sprawdzić, jakie indeksy zostały nadane lub wyświetlić tylko wartości bez indeksów, możesz skorzystać z następującego fragmentu kodu:

import pandas as pd

vals_sr = pd.Series(["Val_1", "Val_2", "Val_3", "Val_4", "Val_5"], index=["A", "B", "C", "D", "E"])

print(vals_sr)

print(vals_sr.index) # -- zwraca obiekty typu Index

print(vals_sr.values) # -- zwraca obiekt typu ndarray

DataFrame

DataFrame to dwuwymiarowa struktura danych podobna do tabeli w bazie danych lub arkusza kalkulacyjnego Excela. DataFrame składa się z wierszy i kolumn – każda kolumna w DataFrame to Series. Jak pewnie się domyślasz, mimo że dana kolumna zawiera tylko jeden typ danych, to DataFrame może zawierać wiele kolumn, z których każda ma dane innego typu. Przykładem może być utworzenie DataFrame z danych na temat transakcji dokonywanych przez klientów, których identyfikujemy po ID.

import pandas as pd

ct_data = {

    'client_id': ['C34P', 'C35S', 'C35P', 'C97S', 'C58S'],

    'card_transactions': [11, 244, 31, 458, 63]

}

client_transaction_df = pd.DataFrame(ct_data)

print(client_transaction_df)

Wczytywanie danych z różnych źródeł

Jedną z najważniejszych zalet biblioteki Pandas jest łatwość, z jaką można wczytać dane z różnych źródeł i formatów plików. Do najpopularniejszych należą: 

  • CSV 
  • Excel (.xlsx) 
  • SQL 
  • Pliki płaskie (flat files, np. plik tekstowy) 

Dane z pliku CSV można wczytać do DataFrame za pomocą funkcji pd.read_csv(). 

import pandas as pd

df = pd.read_csv('path_to_your_file.csv')

print(df)

Podobnie, możemy wczytać plik Excela za pomocą funkcji pd.read_excel(). 

import pandas as pd

df = pd.read_excel('path_to_your_file.xlsx')

print(df)

Aby wczytać wynik zapytania SQL, musimy najpierw utworzyć połączenie do bazy danych. Na przykładzie bazy danych SQLite możemy zrobić to w następujący sposób:

import pandas as pd

import sqlite3

# Ustanawianie połączenia do bazy danych

conn = sqlite3.connect("database_name.db")

# Wykonanie zapytania

df = pd.read_sql_query("SELECT * FROM my_table", conn)

print(df)

Zakładając, że korzystasz z innej bazy danych, musisz zainstalować odpowiedni sterownik dla Pythona i zastąpić sqlite3.connect odpowiednim połączeniem. Jeżeli chcesz dowiedzieć się więcej na temat sqlite, zachęcam cię do odwiedzenia dokumentacji sqlite3.

W następnym rozdziale omówimy podstawowe operacje na danych z wykorzystaniem Series i DataFrame. 

Podstawowe operacje na danych

Kiedy już wiesz, jak wczytać dane za pomocą biblioteki Pandas, skupimy się teraz na wybieraniu, filtrowaniu i sortowaniu danych oraz zastosowaniu funkcji apply i map.

Wybieranie, filtrowanie i sortowanie danych

Jedną z podstawowych i najczęściej używanych operacji jest wybieranie określonych danych z DataFrame. Pandas umożliwia wybieranie danych na wiele sposobów: 

  • Wybieranie kolumn: df[’nazwa_kolumny’] 
  • Wybieranie wierszy za pomocą numerów indeksów: df.iloc[indeks] 
  • Wybieranie wierszy za pomocą etykiet indeksów: df.loc[etykieta]

Przykładowy fragment kodu zamieszczam poniżej: 

import pandas as pd

ct_data = {

    'client_id': ['C34P', 'C35S', 'C35P', 'C97S', 'C58S'],

    'count': [11, 244, 31, 458, 63]

}

df = pd.DataFrame(ct_data)

print(df)

# Wybieranie kolumny 'client_id'

print(df['client_id'])

 

# Wybieranie pierwszego wiersza

print(df.iloc[0])

# Wybieranie wiersza o etykiecie indeksu zero

print(df.loc[0])

Filtrowanie to proces wybierania podzbioru danych na podstawie zadanych kryteriów. Przykładowo, możemy chcieć wybrać tylko te transakcje, które są dostępne w ilości większej niż 60:

filtered_df = df[df['count'] > 60]

print(filtered_df)

Sortowanie danych jest prostym procesem, który możemy przeprowadzić za pomocą metody sort_values():

sorted_df = df.sort_values('count')

print(sorted_df)

Operacje na kolumnach: dodawanie, usuwanie, zmiana nazw

Aby dodać nową kolumnę do DataFrame, możemy po prostu przypisać dane do nowej kolumny, jak w poniższym przykładzie: 

df['amount'] = [1200, 4500, 3000, 28000, 700] # -- dodajemy kolumnę z sumą kwot, na które wykonano transakcje

print(df)

Aby usunąć kolumnę, skorzystamy z metody drop():

df = df.drop('amount', axis=1)

print(df)

Zmiana nazwy kolumny jest możliwa za pomocą metody rename():

df = df.rename(columns={'client_id': 'client_code', 'count': 'quantity'})

print(df)

Użycie funkcji apply i map

Funkcje apply i map pozwalają na zastosowanie wybranej funkcji do każdego elementu zapisanego w Series lub DataFrame. Przykładowo, użycie funkcji z biblioteki NumPy dla kolumny ‘quantity’.

import numpy as np

df['log_quantity'] = df['quantity'].apply(np.log)

print(df)

Metoda map jest podobna do apply, ale działa tylko na Series. Jest często używana do zamiany wartości na podstawie słownika. Przykładowo, dla listy klientów chcemy dodać dodatkową cyfrę w identyfikatorze.

code_map = {

    'C34P': '0C34P',

    'C35S': '1C35S',

    'C35P': '1C35P',

    'C97S': '0C97S',

    'C58S': '0C58S'

}

df['client_code'] = df['client_code'].map(code_map)

print(df)

Czyszczenie i naprawa brakujących danych

Praca z danymi, które pochodzą ze źródeł rzeczywistych, praktycznie zawsze wiąże się z koniecznością ich czyszczenia lub poprawiania. Często dane zawierają braki, duplikaty lub typy danych, które nie są odpowiednie do planowanej analizy. W tym rozdziale omówię proste sytuacje i pokażę ci, jak radzić sobie z takimi problemami za pomocą narzędzi z biblioteki Pandas.

Obsługa brakujących danych (NaN)

Brakujące dane są oznaczane jako NaN (Not a Number). Pandas oferuje kilka metod do obsługi brakujących danych i są to np.: 

  • Wypełnianie brakujących danych określoną wartością 
  • Usuwanie wierszy z brakującymi danymi 

Metoda fillna() pozwala na wypełnienie brakujących danych określoną wartością lub za pomocą określonej metody (np. ’forward fill’  – ffill, ’backward fill’  – bfill): 

import numpy as np

data = {

    'A': [1, 2, np.nan],

    'B': [5, np.nan, np.nan],

    'C': [1, 2, 3]

}

df = pd.DataFrame(data)

df_filled_zeros = df.fillna(value=0)  # --Wypełniamy brakujące dane wartością 0

print(df_filled_zeros)

Możliwe jest też usunięcie wierszy, które zawierają brakujące dane. W przypadku dużego zbioru i niewielkiej liczby “zepsutych” wierszy nie powinno mieć to dużego wpływu na jakość danych, ale przy niewielkim zbiorze usunięcie kilku wierszy może znacząco wpłynąć na późniejszą analizę. Jeżeli jednak zdecydujesz się na usunięcie wybranych wierszy, to możesz użyć metody dropna():.

df_dropped = df.dropna()  # Usuwamy wiersze z brakującymi danymi

print(df_dropped)

Czasami dochodzi do sytuacji, że w naszym zbiorze znajduje się wiele duplikatów, które z punktu widzenia analizy są zbędne. Usunięcie duplikatów jest przydatne szczególnie w sytuacji, gdy stanowią one większość naszego zbioru. Pozbycie się ich pozwoli na odciążenie biblioteki i wydajniejsze operacje np. na kolumnach w DataFrame. Pandas dostarcza metodę drop_duplicates(), która pozwala na łatwe usunięcie duplikatów:

data = {

    'client_id': ['C34P', 'C35S', 'C35P', 'C35P','C97S', 'C58S', 'C58S'],

    'count': [11, 244, 31, 31, 458, 63, 63]

}

df = pd.DataFrame(data)

df = df.drop_duplicates()  # Usuwamy duplikaty

print(df)

Więcej o pracy z brakującymi danymi dowiesz się z obszernej dokumentacji na Pydata.org.  

Jeżeli pracujesz na danych dostarczanych przez inne osoby lub firmy, możesz spotkać się z danymi numerycznymi (liczby całkowite, cyfry, liczby zmiennoprzecinkowe), które przedstawione są jako ciągi znaków (string). Czyli np. liczba całkowita 200 w DataFrame zapisana jest jako string o wartości ‘200’. Interpreter potraktuje to jako tekst, a nie liczbę. Jeżeli chcesz wykonywać na takich danych operacje statystyczne lub matematyczne, konieczne jest zmienienie typu danych kolumny (w tym przypadku z ‘str’ na ‘int’). Możemy to zrobić za pomocą metody astype():

import pandas as pd

data = {

    'client_id': ['C34P', 'C35S', 'C35P', 'C97S', 'C58S'],

    'count': ['11', '244', '31', '458', '63']

}

df = pd.DataFrame(data)

df['count'] = df['count'].astype(int)  # Zmieniamy typ danych kolumny 'count' na int

print(df)

Podsumowując, czyszczenie danych to zazwyczaj niezbędny krok w procesie przetwarzania i analizy danych. Pandas oferuje wiele narzędzi, które ułatwiają ten proces. Jeżeli chcesz dowiedzieć się więcej o pracy z plikami tekstowymi, oto link do dokumentacji:

W Inetum pracuje głównie nad zagadnieniami związanymi z językiem Python i przetwarzaniem danych. Metryki, modelowanie i obliczenia numeryczne oraz współpraca centrów badawczych z przemysłem także nie są mu obce. Bardzo interesuje się bioinformatyką, w której chciałby rozwijać swoje kompetencje.

Zapisz się do newslettera, ekskluzywna zawartość czeka

Bądź na bieżąco z najnowszymi artykułami i wydarzeniami IT

Informacje dotyczące przetwarzania danych osobowych

Zapisz się do newslettera, ekskluzywna zawartość czeka

Bądź na bieżąco z najnowszymi artykułami i wydarzeniami IT

Informacje dotyczące przetwarzania danych osobowych

Zapisz się do newslettera, aby pobrać plik

Bądź na bieżąco z najnowszymi artykułami i wydarzeniami IT

Informacje dotyczące przetwarzania danych osobowych

Dziękujemy za zapis na newsletter — został ostatni krok do aktywacji

Potwierdź poprawność adresu e-mail klikając link wiadomości, która została do Ciebie wysłana w tej chwili.

 

Jeśli w czasie do 5 minut w Twojej skrzynce odbiorczej nie będzie wiadomości to sprawdź również folder *spam*.

Twój adres e-mail znajduje się już na liście odbiorców newslettera

Wystąpił nieoczekiwany błąd

Spróbuj ponownie za chwilę.

    Get notified about new articles

    Be a part of something more than just newsletter

    I hereby agree that Inetum Polska Sp. z o.o. shall process my personal data (hereinafter ‘personal data’), such as: my full name, e-mail address, telephone number and Skype ID/name for commercial purposes.

    I hereby agree that Inetum Polska Sp. z o.o. shall process my personal data (hereinafter ‘personal data’), such as: my full name, e-mail address and telephone number for marketing purposes.

    Read more

    Just one click away!

    We've sent you an email containing a confirmation link. Please open your inbox and finalize your subscription there to receive your e-book copy.

    Note: If you don't see that email in your inbox shortly, check your spam folder.