Last modified: January 01, 2021
This article is written in: 🇵🇱
Pandas to potężna biblioteka w języku Python, przeznaczona do analizy i przetwarzania danych. Jednym z kluczowych zastosowań Pandas jest obsługa plików CSV (Comma-Separated Values). Biblioteka ta udostępnia funkcje takie jak to_csv() do zapisywania ramki danych (DataFrame) do pliku CSV oraz read_csv() do wczytywania danych z pliku CSV.
to_csv() i read_csv()Przyjrzyjmy się, jak można wykorzystać te funkcje na praktycznym przykładzie. Załóżmy, że mamy następujące dane dotyczące rachunków za prąd w wybranym okresie:
import pandas as pd
# Przygotowanie danych
data = {
    "Data": ["2022-01-01", "2022-02-01", "2022-03-01"],
    "Kwota": [100, 120, 130]
}
df = pd.DataFrame(data)
# Zapis danych do pliku CSV
nazwa_pliku = "rachunki.csv"
df.to_csv(nazwa_pliku, index=False, sep=';', encoding='utf-8')
print(f"Dane zapisane do {nazwa_pliku}!")
# Odczyt danych z pliku CSV
df_odczytane = pd.read_csv(nazwa_pliku, sep=';', encoding='utf-8')
print("\nOdczytane dane z pliku CSV:")
print(df_odczytane)Po wykonaniu powyższego kodu, w pliku rachunki.csv znajdą się dane:
| Data | Kwota | 
| 2022-01-01 | 100 | 
| 2022-02-01 | 120 | 
| 2022-03-01 | 130 | 
Kilka uwag:
sep=';' określa separator używany w pliku CSV. W niektórych regionach standardowo używa się przecinka, ale w wielu krajach, gdzie przecinek jest używany jako separator dziesiętny, używa się średnika.encoding='utf-8' zapewnia, że plik będzie zakodowany w formacie UTF-8, co jest szczególnie ważne, jeśli dane zawierają znaki spoza ASCII, np. polskie litery.Pandas udostępnia również wiele dodatkowych opcji dla read_csv(), pozwalających na bardziej zaawansowaną kontrolę nad procesem wczytywania danych, takich jak określenie typów kolumn, przetwarzanie brakujących danych i wiele innych.
Gdy wczytujemy dane w formie tabeli przy użyciu biblioteki Pandas, często chcemy najpierw przeprowadzić ich podstawową analizę i wstępne przetwarzanie. Oto kilka przydatnych funkcji i technik, które ułatwią ten proces.
Przykładowy zestaw danych, na którym będziemy wykonywać operacje, wygląda następująco:
| Imię | Wiek | Miasto | Wynagrodzenie | 
| Jan | 28 | Warszawa | 4500 | 
| Anna | 22 | Kraków | 3900 | 
| Piotr | 34 | Warszawa | 5200 | 
| Maria | 45 | Gdańsk | 6100 | 
| Tomasz | 30 | Wrocław | 4700 | 
Kod wczytujący te dane do Pandas:
import pandas as pd
data = {
    'Imię': ['Jan', 'Anna', 'Piotr', 'Maria', 'Tomasz'],
    'Wiek': [28, 22, 34, 45, 30],
    'Miasto': ['Warszawa', 'Kraków', 'Warszawa', 'Gdańsk', 'Wrocław'],
    'Wynagrodzenie': [4500, 3900, 5200, 6100, 4700]
}
df = pd.DataFrame(data)Aby uzyskać ogólny przegląd wczytanej tabeli, można użyć funkcji info(). Dostarcza ona informacje na temat liczby wierszy i kolumn, typów danych w poszczególnych kolumnach oraz ilości brakujących wartości.
df.info()Wynik:
<class 'pandas.core.frame.dataframe'="">
RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):
 #   Column         Non-Null Count  Dtype 
---  ------         --------------  ----- 
 0   Imię           5 non-null      object
 1   Wiek           5 non-null      int64 
 2   Miasto         5 non-null      object
 3   Wynagrodzenie  5 non-null      int64 
dtypes: int64(2), object(2)
memory usage: 288.0+ bytesJeśli chcemy rzucić okiem na początkowe lub końcowe wiersze tabeli, przydadzą się funkcje head() oraz tail(). Domyślnie zwracają one 5 wierszy, ale można zmienić ten limit, podając odpowiednią liczbę jako argument.
df.head(10) # pierwsze 10 wierszy
df.tail(3)  # ostatnie 3 wierszeWynik dla df.head(3):
Imię  Wiek    Miasto  Wynagrodzenie
0     Jan    28  Warszawa          4500
1    Anna    22    Kraków          3900
2   Piotr    34  Warszawa          5200Jeśli chcemy skupić się na konkretnych kolumnach, możemy je łatwo wybrać. Na przykład, jeśli chcemy wybrać tylko kolumny "Imię" i "Wiek":
df_selected = df[['Imię', 'Wiek']]Wynik:
Imię  Wiek
0     Jan    28
1    Anna    22
2   Piotr    34
3   Maria    45
4  Tomasz    30Aby przefiltrować wiersze w tabeli na podstawie pewnych kryteriów, korzystamy z metody loc[]. Na przykład, wybieranie wierszy, w których wartość w kolumnie "Wiek" jest większa niż 30:
starsi_niz_30 = df.loc[df['Wiek'] > 30]Wynik:
Imię  Wiek    Miasto  Wynagrodzenie
2  Piotr    34  Warszawa          5200
3  Maria    45    Gdańsk          6100Aby wybrać wiersze, w których wiek użytkownika przekracza 30 lat i mieszka w Warszawie:
starsi_warszawianie = df.loc[(df['Wiek'] > 30) & (df['Miasto'] == 'Warszawa')]Wynik:
Imię  Wiek    Miasto  Wynagrodzenie
2  Piotr    34  Warszawa          5200Jeśli chcemy szybko poznać podstawowe statystyki dotyczące kolumn numerycznych, możemy użyć funkcji describe():
# Przykładowe dane
data = {
    "Data": ["2022-01-01", "2022-02-01", "2022-03-01"],
    "Kwota": [100, 120, 130]
}
df = pd.DataFrame(data)
# Obliczenie statystyk opisowych
statystyki = df.describe()
print(statystyki)Ta funkcja dostarczy informacji na temat średniej, mediany, odchylenia standardowego i innych podstawowych statystyk dla każdej kolumny numerycznej w tabeli.
Przykładowy wynik działania powyższego kodu:
Kwota
count    3.000000
mean   116.666667
std     15.275252
min    100.000000
25%    110.000000
50%    120.000000
75%    125.000000
max    130.000000Opis wyników:
Pandas pozwala na łatwą agregację danych, na przykład obliczenie średniej, sumy czy liczby wystąpień. Dzięki temu możemy szybko uzyskać kluczowe informacje statystyczne na temat naszych danych.
Przykładowy zestaw danych, na którym będziemy wykonywać operacje, wygląda następująco:
| Data | Klient | Kwota | 
| 2023-01-01 | Jan | 250 | 
| 2023-01-02 | Anna | 300 | 
| 2023-01-03 | Piotr | 450 | 
| 2023-02-01 | Maria | 500 | 
| 2023-02-02 | Tomasz | 600 | 
Kod wczytujący te dane do Pandas:
import pandas as pd
data = {
    'Data': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-02-01', '2023-02-02'],
    'Klient': ['Jan', 'Anna', 'Piotr', 'Maria', 'Tomasz'],
    'Kwota': [250, 300, 450, 500, 600]
}
df = pd.DataFrame(data)
df['Data'] = pd.to_datetime(df['Data'])Aby obliczyć średnią i sumę wartości w kolumnie Kwota, możemy użyć funkcji mean() i sum():
# Średnia wartość w kolumnie Kwota
srednia_kwota = df['Kwota'].mean()
print(f"Średnia wartość rachunku: {srednia_kwota}")
# Suma wartości w kolumnie Kwota
suma_kwot = df['Kwota'].sum()
print(f"Suma wartości rachunków: {suma_kwot}")Wyniki:
Średnia wartość rachunku: 420.0
Suma wartości rachunków: 2100Często przydatne jest grupowanie danych według określonych kryteriów. Pandas umożliwia to za pomocą metody groupby(), która pozwala na grupowanie danych według jednej lub kilku kolumn i wykonywanie agregacji na tych grupach.
Aby grupować dane według miesiąca i obliczyć średnią wartość rachunku, możemy skorzystać z poniższego kodu:
# Dodanie kolumny Miesiąc
df['Miesiąc'] = df['Data'].dt.month
# Grupowanie danych według miesiąca i obliczenie średniej wartości rachunku
srednia_miesieczna = df.groupby('Miesiąc')['Kwota'].mean()
print(srednia_miesieczna)Wynik:
Miesiąc
1    333.333333
2    550.000000
Name: Kwota, dtype: float64W praktycznych zastosowaniach często spotykamy się z brakującymi danymi. Pandas oferuje funkcje takie jak fillna() i dropna(), które pomagają w radzeniu sobie z brakami.
| Data | Klient | Kwota | 
| 2023-01-01 | Jan | 250 | 
| 2023-01-02 | Anna | NaN | 
| 2023-01-03 | Piotr | 450 | 
| 2023-02-01 | Maria | 500 | 
| 2023-02-02 | Tomasz | NaN | 
Kod wczytujący te dane do Pandas:
import numpy as np
data = {
    'Data': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-02-01', '2023-02-02'],
    'Klient': ['Jan', 'Anna', 'Piotr', 'Maria', 'Tomasz'],
    'Kwota': [250, np.nan, 450, 500, np.nan]
}
df = pd.DataFrame(data)
df['Data'] = pd.to_datetime(df['Data'])Aby uzupełnić brakujące wartości średnią z kolumny Kwota, możemy użyć funkcji fillna():
# Uzupełnianie brakujących wartości średnią
df_filled = df.fillna(df['Kwota'].mean())
print(df_filled)Wynik:
Data  Klient  Kwota
0 2023-01-01     Jan  250.0
1 2023-01-02    Anna  400.0
2 2023-01-03   Piotr  450.0
3 2023-02-01   Maria  500.0
4 2023-02-02  Tomasz  400.0Aby usunąć wiersze z brakującymi wartościami, używamy funkcji dropna():
# Usuwanie wierszy z brakującymi wartościami
df_dropped = df.dropna()
print(df_dropped)Wynik:
Data Klient  Kwota
0 2023-01-01    Jan  250.0
2 2023-01-03  Piotr  450.0
3 2023-02-01  Maria  500.0