Szaleństwem jest robić wciąż to samo i oczekiwać różnych rezultatów.
Albert Einstein
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.
series[1]mask=[1, 3, 5 ], a
następnie przekazanie jej do serii series[mask].
Uzyskamy dostęp do wybranych indeksów,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, 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 elementachs1.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 indeksachs1.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óws1.nunique() zwraca liczbę unikalnych wartościs1.unique() zwraca listę z unikalnymi wartościamis1.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.