Jeśli sądzisz, że wykształcenie drogo kosztuje, spróbuj niewiedzy.

Benjamin Franklin

Series to jednowymiarowa tablica przeznaczona do przechowywania danych. Składa się ona z danych, oraz odnośników do nich, zwanych powszechnie index'ami. Pisząc dane mam na myśli wszystkie standardowe typy występujące w języku Python jak liczby stałe, listy, tuple, obiekty, itd.

employee_fields = ["Name", "Surename", "ID", "Salary"]
employee_data   = ["Krzysztof", "Kowalski", "123456", 5000]
employee_series = pd.Series(index = employee_fields,
                            data = employee_data)
print(employee_series)
    Name        Krzysztof
    Surename     Kowalski
    ID             123456
    Salary           5000
    dtype: object

Taki sam efekt uzyskamy tworząc obiekt bezpośrednio ze słownika

employee_dict   = { "Name": "Krzysztof", 
                    "Surename": "Kowalski", 
                    "ID": "123456",
                    "Salary": 5000}
employee_series = pd.Series(employee_dict)

Dostęp do wartości i indeksów uzyskujemy przez własności values, oraz index:

>>> employee_series.values
array(['Krzysztof', 'Kowalski', '123456', 5000], dtype=object)

>>> employee_series.index
Index(['Name', 'Surename', 'ID', 'Salary'], dtype='object')

Będąc w tym punkcie warto sprawdzić jakiego typu jest obiekt zwrócony przez wspomniane własności.

type(employee_series)       # <class 'pandas.core.series.Series'>
type(employee_series.index) # <class 'pandas.core.indexes.base.Index'>
type(employee_series.values)# <class 'numpy.ndarray'>

Dostęp do elementów utworzone obiektu mamy poprzez numeryczne indeksy:

>>> employee_series[0]
'Krzysztof'
>>> employee_series[0:2]
Name        Krzysztof
Surename     Kowalski
dtype: object

Lub też podając nazwy indeksów do których chcemy uzyskać dostęp:

>>> employee_series[["Name", "Surename"]]
Name        Krzysztof
Surename     Kowalski
dtype: object

Podstawową strukturą danych pakietu pandas jest Series. Jest to jednowymiarowa tablica z indeksowanymi elementami. Przykład użycia tworzący Series z listy elementów: s = Series( [1, 2, 4, 5, 5] ) i dający im domyślne, numeryczne, indeksy. Wartości indeksów możemy nadawać samodzielnie s = Series( [1, 2, 4, 5, 5], index =['a', 'b', 'c', 'd', 'e'] ). Wyświetlając na ekranie utworzony obiekt zobaczymy, że oprócz elementów wyświetlone zostaną również przyporządkowane im indeksy.

Dostęp do elementów realizowany jest przez podanie interesujących nas indeksów. Na przykład s[ [1, 2] ) by uzyskać dostęp do elementu z indeksem 1, oraz 2. Ciekawostką jest, że w przypadku nadania nie numerycznych indeksów elementom tabeli w dalszym ciągu będziemy w stanie uzyskać do nich dostęp podając ich numeryczną pozycję.

Dostęp do samych wartości indeksów realizowany jest przez s.index i wraca obiekt Index zawierający nazwy wszystkich użytych etykiet.

Często jako etykiet używa się dat. Istnieje specjalna klasa DatetimeIndex stanowiąca indeks zoptymalizowany do przechowywania dat i czasów. Przykładowo by stworzyć etykiety prezentujące serię dat pomiędzy określonymi i włączonymi do serii punktami w czasie możemy wykonać kod: dates_label = pd.date_range('2020-03-01', '2020-03-31'). Sam w sobie indeks jest mało użyteczny, jednak możemy go wykorzystać do indeksowania elementów w Series.

Obiekt Series to nazwany szereg danych. Nazwę nadajemy przez przypisanie do atrybutu .name wartości.

Dostęp do elementu

  • wykorzystując numer indeksu, np. series[1]
  • wykorzystując maskę indeksów mask=[1, 3, 5 ], a następnie przekazanie jej do serii series[mask]. Uzyskamy dostęp do wybranych indeksów,
  • wykorzystując maskę boolowską mask=[True, False, True, False, True], a następnie przekazanie jej do serii series[mask]. Uzyskamy dostęp do elementów na pozycjach True,

Przekształcanie danych

Przekształcanie danych, ang. data wrangling to jedna z podstawowych operacji w czasie analizy danych. Przykładowe operacje, które mogą być pomocne od samego początku przygody z Pandas

  • s1.isin(s2) zwraca Series z maską boolowską dla stanowiącą porównanie elementów,
  • s1.map(lambda x: ...) zastosuj funkcję lambda na wszystkich elementach
  • s1.drop(labels=[1, 2]) usuń elementy o indeksach 1 i 2,
  • s1.add(s2) zwraca obiekt Series z elementami będącymi sumą elementów na poszczególnych indeksach
  • s1.append(s2) łączenie dwóch Series. Istotne jest to, że połączone zostaną zarówno dane, jak i przypisane do nich indeksy. Może to być dość mylące, dlatego też przed wykonaniem operacji warto wywołać funkcję z parametrem s1.append(s2, ignore_index=True)
  • s1.count() zwraca liczbę elementów
  • s1.nunique() zwraca liczbę unikalnych wartości
  • s1.unique() zwraca listę z unikalnymi wartościami
  • s1.sort_values() zwraca obiekt Series z posortowanymi wartościami. Przyporządkowane indeksy do elementów dalej pozostaną przypisane do oryginalnych wartości.
  • s1.sort_values(inplace=True) sortuje wartości obiektu. Przyporządkowane indeksy do elementów dalej pozostaną przypisane do oryginalnych wartości.
  • s1.reset_index(drop=True) resetuje index zaczynając numerację od 0.
  • s1.reset_index() zwraca DataFrame z nowym indeksem zaczynającym się od zera, zaś stary indeks zostanie przypisany do kolumny "Index".
  • s1.astype("float64") konwertuje dane na żądany typ.
Artykuł dodano 2022-10-25