Python Pandas - szybki przewodnik
Pandas to biblioteka języka Python o otwartym kodzie źródłowym zapewniająca wydajne narzędzie do manipulacji i analizy danych przy użyciu potężnych struktur danych. Nazwa Pandy pochodzi od słowa Panel Data - an Econometrics from Multidimensional danych.
W 2008 roku deweloper Wes McKinney zaczął tworzyć pandy, gdy potrzebował wydajnego, elastycznego narzędzia do analizy danych.
Przed Pandas, Python był głównie używany do zmiany danych i przygotowania. Miał bardzo niewielki wkład w analizę danych. Pandy rozwiązały ten problem. Korzystając z Pandas, możemy wykonać pięć typowych kroków w przetwarzaniu i analizie danych, niezależnie od ich pochodzenia - ładowanie, przygotowywanie, manipulowanie, modelowanie i analizowanie.
Python with Pandas jest używany w wielu dziedzinach, w tym w dziedzinach akademickich i komercyjnych, w tym w finansach, ekonomii, statystyce, analityce itp.
Kluczowe cechy Pand
- Szybki i wydajny obiekt DataFrame z domyślnym i dostosowanym indeksowaniem.
- Narzędzia do ładowania danych do obiektów danych w pamięci z różnych formatów plików.
- Dopasowanie danych i zintegrowana obsługa brakujących danych.
- Przekształcanie i obracanie zestawów dat.
- Krojenie na podstawie etykiet, indeksowanie i podzbiór dużych zbiorów danych.
- Kolumny ze struktury danych można usuwać lub wstawiać.
- Grupuj według danych w celu agregacji i przekształceń.
- Wysokowydajne scalanie i łączenie danych.
- Funkcjonalność szeregów czasowych.
Standardowa dystrybucja Pythona nie jest dostarczana w pakiecie z modułem Pandas. Lekką alternatywą jest instalacja NumPy za pomocą popularnego instalatora pakietów Pythona,pip.
pip install pandas
Jeśli zainstalujesz pakiet Anaconda Python, Pandy zostaną zainstalowane domyślnie z następującymi -
Windows
Anaconda (od https://www.continuum.io) to darmowa dystrybucja Pythona dla stosu SciPy. Jest również dostępny dla systemów Linux i Mac.
Canopy (https://www.enthought.com/products/canopy/) jest dostępny zarówno jako bezpłatna, jak i komercyjna dystrybucja z pełnym stosem SciPy dla systemów Windows, Linux i Mac.
Python(x, y) to darmowa dystrybucja Pythona ze stosem SciPy i Spyder IDE dla systemu operacyjnego Windows. (Do pobrania zhttp://python-xy.github.io/)
Linux
Menedżery pakietów odpowiednich dystrybucji Linuksa są używane do instalowania jednego lub więcej pakietów na stosie SciPy.
For Ubuntu Users
sudo apt-get install python-numpy python-scipy python-matplotlibipythonipythonnotebook
python-pandas python-sympy python-nose
For Fedora Users
sudo yum install numpyscipy python-matplotlibipython python-pandas sympy
python-nose atlas-devel
Pandas radzi sobie z następującymi trzema strukturami danych -
- Series
- DataFrame
- Panel
Te struktury danych są zbudowane na podstawie tablicy Numpy, co oznacza, że są szybkie.
Wymiar i opis
Najlepszym sposobem myślenia o tych strukturach danych jest to, że wyżej wymiarowa struktura danych jest zbiornikiem jej niższej wymiarowej struktury danych. Na przykład DataFrame jest kontenerem Series, Panel jest kontenerem DataFrame.
Struktura danych | Wymiary | Opis |
---|---|---|
Seria | 1 | Jednorodna tablica znakowana 1D, z możliwością zmiany rozmiaru. |
Ramki danych | 2 | Ogólna struktura tabelaryczna oznaczona etykietami 2D, z możliwością zmiany rozmiaru, z potencjalnie niejednorodnymi typami kolumn. |
Płyta | 3 | Ogólna tablica znakowana 3D, zmienna wielkość. |
Budowanie i obsługa dwu- lub więcej wymiarowych tablic jest żmudnym zadaniem, podczas pisania funkcji na użytkowniku spoczywa ciężar rozważenia orientacji zestawu danych. Jednak użycie struktur danych Pandas ogranicza wysiłek umysłowy użytkownika.
Na przykład w przypadku danych tabelarycznych (DataFrame) bardziej semantycznie pomocne jest myślenie o index (rzędy) i columns zamiast osi 0 i osi 1.
Zmienność
Wszystkie struktury danych Pandas są wartościami zmiennymi (można je zmienić), a poza seriami wszystkie mają zmienną wielkość. Seria ma niezmienną wielkość.
Note- DataFrame jest szeroko stosowana i jest jedną z najważniejszych struktur danych. Panel jest używany znacznie mniej.
Seria
Szereg to jednowymiarowa struktura przypominająca tablicę z jednorodnymi danymi. Na przykład poniższa seria to zbiór liczb całkowitych 10, 23, 56,…
10 | 23 | 56 | 17 | 52 | 61 | 73 | 90 | 26 | 72 |
Kluczowe punkty
- Jednorodne dane
- Niezmienny rozmiar
- Wartości zmiennych danych
Ramka danych
DataFrame to dwuwymiarowa tablica z niejednorodnymi danymi. Na przykład,
Nazwa | Wiek | Płeć | Ocena |
---|---|---|---|
Steve | 32 | Męski | 3.45 |
Lia | 28 | Płeć żeńska | 4.6 |
Vin | 45 | Męski | 3.9 |
Katie | 38 | Płeć żeńska | 2,78 |
Tabela przedstawia dane zespołu sprzedażowego organizacji wraz z ogólną oceną wydajności. Dane są przedstawiane w wierszach i kolumnach. Każda kolumna reprezentuje atrybut, a każdy wiersz reprezentuje osobę.
Typ danych kolumn
Typy danych w czterech kolumnach są następujące -
Kolumna | Rodzaj |
---|---|
Nazwa | Strunowy |
Wiek | Liczba całkowita |
Płeć | Strunowy |
Ocena | Pływak |
Kluczowe punkty
- Dane heterogeniczne
- Rozmiar zmienny
- Zmienne dane
Płyta
Panel to trójwymiarowa struktura danych z niejednorodnymi danymi. Trudno jest przedstawić panel w graficznej reprezentacji. Ale panel można zilustrować jako kontener DataFrame.
Kluczowe punkty
- Dane heterogeniczne
- Rozmiar zmienny
- Zmienne dane
Seria to jednowymiarowa tablica z etykietami, która może przechowywać dane dowolnego typu (liczby całkowite, ciągi znaków, zmiennoprzecinkowe, obiekty Pythona itp.). Etykiety osi są zbiorczo nazywane indeksami.
pandy. serie
Serię pand można utworzyć za pomocą następującego konstruktora -
pandas.Series( data, index, dtype, copy)
Parametry konstruktora są następujące -
Sr.No | Parametr i opis |
---|---|
1 | data dane przybierają różne formy, takie jak ndarray, lista, stałe |
2 | index Wartości indeksu muszą być unikalne i możliwe do skasowania, a także mieć taką samą długość jak dane. Domyślnanp.arange(n) jeśli żaden indeks nie zostanie przekazany. |
3 | dtype dtype jest dla typu danych. Jeśli Brak, zostanie wywnioskowany typ danych |
4 | copy Skopiuj dane. Domyślnie False |
Serię można utworzyć przy użyciu różnych danych wejściowych, takich jak -
- Array
- Dict
- Wartość skalarna lub stała
Utwórz pustą serię
Podstawową serią, którą można stworzyć, jest seria pusta.
Przykład
#import the pandas library and aliasing as pd
import pandas as pd
s = pd.Series()
print s
Jego output wygląda następująco -
Series([], dtype: float64)
Utwórz serię z ndarray
Jeśli dane są tablicą ndarray, to przekazany indeks musi mieć taką samą długość. Jeśli żaden indeks nie zostanie przekazany, domyślnie indeks będzierange(n) gdzie n jest długością tablicy, tj. [0,1,2,3…. range(len(array))-1].
Przykład 1
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data)
print s
Jego output wygląda następująco -
0 a
1 b
2 c
3 d
dtype: object
Nie przekazaliśmy żadnego indeksu, więc domyślnie przypisał indeksy z zakresu od 0 do len(data)-1czyli od 0 do 3.
Przykład 2
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data,index=[100,101,102,103])
print s
Jego output wygląda następująco -
100 a
101 b
102 c
103 d
dtype: object
Przekazaliśmy tutaj wartości indeksu. Teraz możemy zobaczyć dostosowane wartości indeksowane w danych wyjściowych.
Stwórz serię na podstawie dyktatu
ZA dictmożna przekazać jako dane wejściowe i jeśli nie określono indeksu, klucze słownika są brane w kolejności posortowanej w celu skonstruowania indeksu. Gdybyindex zostanie przekazana, wartości w danych odpowiadające etykietom w indeksie zostaną wyciągnięte.
Przykład 1
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data)
print s
Jego output wygląda następująco -
a 0.0
b 1.0
c 2.0
dtype: float64
Observe - Klucze słownika służą do tworzenia indeksu.
Przykład 2
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data,index=['b','c','d','a'])
print s
Jego output wygląda następująco -
b 1.0
c 2.0
d NaN
a 0.0
dtype: float64
Observe - Kolejność indeksów jest utrwalana, a brakujący element jest wypełniany wartością NaN (Not a Number).
Utwórz serię na podstawie skalara
Jeśli dane są wartością skalarną, należy podać indeks. Wartość zostanie powtórzona, aby dopasować długośćindex
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
s = pd.Series(5, index=[0, 1, 2, 3])
print s
Jego output wygląda następująco -
0 5
1 5
2 5
3 5
dtype: int64
Dostęp do danych z serii z pozycją
Dostęp do danych w serii można uzyskać podobnie jak w pliku ndarray.
Przykład 1
Pobierz pierwszy element. Jak już wiemy, że zaczyna liczyć od zera do tablicy, co oznacza, że pierwszy element jest przechowywany w temperaturze zera th pozycji i tak dalej.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve the first element
print s[0]
Jego output wygląda następująco -
1
Przykład 2
Odzyskaj pierwsze trzy elementy z serii. Jeśli przed nim zostanie wstawiony:, wszystkie elementy począwszy od tego indeksu zostaną wyodrębnione. Jeśli używane są dwa parametry (z: między nimi), elementy między dwoma indeksami (bez indeksu stop)
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve the first three element
print s[:3]
Jego output wygląda następująco -
a 1
b 2
c 3
dtype: int64
Przykład 3
Odzyskaj ostatnie trzy elementy.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve the last three element
print s[-3:]
Jego output wygląda następująco -
c 3
d 4
e 5
dtype: int64
Pobierz dane za pomocą etykiety (indeksu)
Seria jest jak stała wielkość dict dzięki temu można pobierać i ustawiać wartości według etykiety indeksu.
Przykład 1
Pobierz pojedynczy element za pomocą wartości etykiety indeksu.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve a single element
print s['a']
Jego output wygląda następująco -
1
Przykład 2
Pobierz wiele elementów, korzystając z listy wartości etykiet indeksu.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve multiple elements
print s[['a','c','d']]
Jego output wygląda następująco -
a 1
c 3
d 4
dtype: int64
Przykład 3
Jeśli etykieta nie jest zawarta, zgłaszany jest wyjątek.
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#retrieve multiple elements
print s['f']
Jego output wygląda następująco -
…
KeyError: 'f'
Ramka danych to dwuwymiarowa struktura danych, tj. Dane są wyrównane tabelarycznie w wierszach i kolumnach.
Funkcje DataFrame
- Potencjalnie kolumny są różnych typów
- Rozmiar - zmienny
- Oznakowane osie (wiersze i kolumny)
- Potrafi wykonywać operacje arytmetyczne na wierszach i kolumnach
Struktura
Załóżmy, że tworzymy ramkę danych z danymi ucznia.
Możesz myśleć o tym jako o tabeli SQL lub reprezentacji danych w arkuszu kalkulacyjnym.
pandas.DataFrame
Pandy DataFrame można utworzyć za pomocą następującego konstruktora -
pandas.DataFrame( data, index, columns, dtype, copy)
Parametry konstruktora są następujące -
Sr.No | Parametr i opis |
---|---|
1 | data dane mają różne formy, takie jak ndarray, seria, mapa, listy, dykt, stałe, a także inna ramka DataFrame. |
2 | index W przypadku etykiet wierszy indeksem, który ma być użyty dla wynikowej ramki, jest opcjonalny domyślny np.arange (n), jeśli żaden indeks nie zostanie przekazany. |
3 | columns W przypadku etykiet kolumn opcjonalna składnia domyślna to - np.arange (n). Dzieje się tak tylko wtedy, gdy nie zostanie przekazany żaden indeks. |
4 | dtype Typ danych w każdej kolumnie. |
5 | copy To polecenie (lub cokolwiek to jest) jest używane do kopiowania danych, jeśli domyślną wartością jest False. |
Utwórz DataFrame
Ramkę danych pandy można utworzyć przy użyciu różnych danych wejściowych, takich jak -
- Lists
- dict
- Series
- Numpy ndarrays
- Inny DataFrame
W kolejnych sekcjach tego rozdziału zobaczymy, jak utworzyć ramkę DataFrame przy użyciu tych danych wejściowych.
Utwórz pustą ramkę danych
Podstawową ramką danych, którą można utworzyć, jest pusta ramka danych.
Przykład
#import the pandas library and aliasing as pd
import pandas as pd
df = pd.DataFrame()
print df
Jego output wygląda następująco -
Empty DataFrame
Columns: []
Index: []
Utwórz DataFrame z list
Ramkę DataFrame można utworzyć za pomocą pojedynczej listy lub listy list.
Przykład 1
import pandas as pd
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print df
Jego output wygląda następująco -
0
0 1
1 2
2 3
3 4
4 5
Przykład 2
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
print df
Jego output wygląda następująco -
Name Age
0 Alex 10
1 Bob 12
2 Clarke 13
Przykład 3
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
print df
Jego output wygląda następująco -
Name Age
0 Alex 10.0
1 Bob 12.0
2 Clarke 13.0
Note - Obserwuj dtype parametr zmienia typ kolumny Age na zmiennoprzecinkową.
Utwórz DataFrame z Dict of ndarrays / Lists
Wszystkie ndarraysmusi mieć taką samą długość. Jeśli przekazano indeks, długość indeksu powinna być równa długości tablic.
Jeśli żaden indeks nie zostanie przekazany, domyślnie indeks będzie miał wartość range (n), gdzie n to długość tablicy.
Przykład 1
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)
print df
Jego output wygląda następująco -
Age Name
0 28 Tom
1 34 Jack
2 29 Steve
3 42 Ricky
Note- Przestrzegać wartości 0,1,2,3. Są to domyślne indeksy przypisane każdemu przy użyciu zakresu funkcji (n).
Przykład 2
Utwórzmy teraz indeksowaną ramkę DataFrame przy użyciu tablic.
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
print df
Jego output wygląda następująco -
Age Name
rank1 28 Tom
rank2 34 Jack
rank3 29 Steve
rank4 42 Ricky
Note - Obserwuj index parametr przypisuje indeks do każdego wiersza.
Utwórz DataFrame z listy Dicts
Listę słowników można przekazać jako dane wejściowe w celu utworzenia ramki danych. Klucze słownika są domyślnie traktowane jako nazwy kolumn.
Przykład 1
Poniższy przykład pokazuje, jak utworzyć DataFrame, przekazując listę słowników.
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print df
Jego output wygląda następująco -
a b c
0 1 2 NaN
1 5 10 20.0
Note - Obserwuj, NaN (Not a Number) jest dodawany w brakujących obszarach.
Przykład 2
Poniższy przykład pokazuje, jak utworzyć DataFrame, przekazując listę słowników i indeksów wierszy.
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print df
Jego output wygląda następująco -
a b c
first 1 2 NaN
second 5 10 20.0
Przykład 3
Poniższy przykład pokazuje, jak utworzyć DataFrame z listą słowników, indeksów wierszy i indeksów kolumn.
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
#With two column indices, values same as dictionary keys
df1 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b'])
#With two column indices with one index with other name
df2 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b1'])
print df1
print df2
Jego output wygląda następująco -
#df1 output
a b
first 1 2
second 5 10
#df2 output
a b1
first 1 NaN
second 5 NaN
Note- Obserwuj, df2 DataFrame jest tworzony z indeksem kolumny innym niż klucz słownika; w ten sposób dołączone NaN na miejscu. Podczas gdy df1 jest tworzony z indeksami kolumn takimi samymi jak klucze słownika, więc dołączane jest NaN.
Utwórz ramkę DataFrame z Dict of Series
Dictionary of Series można przekazać w celu utworzenia ramki DataFrame. Wynikowy indeks jest sumą wszystkich przekazanych indeksów serii.
Przykład
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df
Jego output wygląda następująco -
one two
a 1.0 1
b 2.0 2
c 3.0 3
d NaN 4
Note - Zauważ, że w przypadku pierwszej serii nie ma etykiety ‘d’ przeszedł, ale w rezultacie dla d etykieta, NaN jest dodawane do NaN.
Zrozummy teraz column selection, addition, i deletion poprzez przykłady.
Wybór kolumny
Zrozumiemy to, wybierając kolumnę z DataFrame.
Przykład
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df ['one']
Jego output wygląda następująco -
a 1.0
b 2.0
c 3.0
d NaN
Name: one, dtype: float64
Dodawanie kolumny
Zrozumiemy to, dodając nową kolumnę do istniejącej ramki danych.
Przykład
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
# Adding a new column to an existing DataFrame object with column label by passing new series
print ("Adding a new column by passing as Series:")
df['three']=pd.Series([10,20,30],index=['a','b','c'])
print df
print ("Adding a new column using the existing columns in DataFrame:")
df['four']=df['one']+df['three']
print df
Jego output wygląda następująco -
Adding a new column by passing as Series:
one two three
a 1.0 1 10.0
b 2.0 2 20.0
c 3.0 3 30.0
d NaN 4 NaN
Adding a new column using the existing columns in DataFrame:
one two three four
a 1.0 1 10.0 11.0
b 2.0 2 20.0 22.0
c 3.0 3 30.0 33.0
d NaN 4 NaN NaN
Usunięcie kolumny
Kolumny można usuwać lub otwierać; weźmy przykład, aby zrozumieć, jak to zrobić.
Przykład
# Using the previous DataFrame, we will delete a column
# using del function
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),
'three' : pd.Series([10,20,30], index=['a','b','c'])}
df = pd.DataFrame(d)
print ("Our dataframe is:")
print df
# using del function
print ("Deleting the first column using DEL function:")
del df['one']
print df
# using pop function
print ("Deleting another column using POP function:")
df.pop('two')
print df
Jego output wygląda następująco -
Our dataframe is:
one three two
a 1.0 10.0 1
b 2.0 20.0 2
c 3.0 30.0 3
d NaN NaN 4
Deleting the first column using DEL function:
three two
a 10.0 1
b 20.0 2
c 30.0 3
d NaN 4
Deleting another column using POP function:
three
a 10.0
b 20.0
c 30.0
d NaN
Zaznaczanie, dodawanie i usuwanie wierszy
Teraz zrozumiemy zaznaczanie, dodawanie i usuwanie wierszy na podstawie przykładów. Zacznijmy od pojęcia selekcji.
Wybór według etykiety
Wiersze można wybrać, przekazując etykietę wiersza do pliku loc funkcjonować.
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df.loc['b']
Jego output wygląda następująco -
one 2.0
two 2.0
Name: b, dtype: float64
Rezultatem jest seria z etykietami jako nazwami kolumn DataFrame. Nazwa serii to etykieta, z którą została pobrana.
Wybór według lokalizacji całkowitej
Wiersze można wybrać, przekazując lokalizację całkowitą do pliku iloc funkcjonować.
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df.iloc[2]
Jego output wygląda następująco -
one 3.0
two 3.0
Name: c, dtype: float64
Rzędy plasterków
Za pomocą operatora „:” można wybrać wiele wierszy.
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df[2:4]
Jego output wygląda następująco -
one two
c 3.0 3
d NaN 4
Dodawanie wierszy
Dodaj nowe wiersze do DataFrame przy użyciu rozszerzenia appendfunkcjonować. Ta funkcja doda wiersze na końcu.
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
print df
Jego output wygląda następująco -
a b
0 1 2
1 3 4
0 5 6
1 7 8
Usunięcie wierszy
Użyj etykiety indeksu, aby usunąć lub upuścić wiersze z DataFrame. Jeśli etykieta jest zduplikowana, wiele wierszy zostanie usuniętych.
Jeśli zauważysz, w powyższym przykładzie etykiety są zduplikowane. Upuśćmy etykietę i zobaczymy, ile wierszy zostanie usuniętych.
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
# Drop rows with label 0
df = df.drop(0)
print df
Jego output wygląda następująco -
a b
1 3 4
1 7 8
W powyższym przykładzie dwa wiersze zostały usunięte, ponieważ te dwa zawierają tę samą etykietę 0.
ZA panelto trójwymiarowy kontener danych. TerminPanel data wywodzi się z ekonometrii i jest częściowo odpowiedzialny za nazwę pandy - pan(el)-da(ta)-s.
Nazwy 3 osi mają nadać znaczenie semantyczne opisowi operacji na danych panelowych. Oni są -
items - oś 0, każdy element odpowiada zawartej wewnątrz ramki DataFrame.
major_axis - oś 1, to indeks (wiersze) każdego elementu DataFrames.
minor_axis - oś 2, to kolumny każdej z ramek DataFrames.
pandas.Panel ()
Panel można utworzyć za pomocą następującego konstruktora -
pandas.Panel(data, items, major_axis, minor_axis, dtype, copy)
Parametry konstruktora są następujące -
Parametr | Opis |
---|---|
dane | Dane przyjmują różne formy, takie jak ndarray, seria, mapa, listy, dykt, stałe, a także inna ramka DataFrame |
przedmiotów | oś = 0 |
major_axis | oś = 1 |
minor_axis | oś = 2 |
dtype | Typ danych w każdej kolumnie |
Kopiuj | Skopiuj dane. Domyślna,false |
Utwórz panel
Panel można utworzyć na wiele sposobów, takich jak -
- Od ndarrays
- Z dyktatu DataFrames
Z 3D ndarray
# creating an empty panel
import pandas as pd
import numpy as np
data = np.random.rand(2,4,5)
p = pd.Panel(data)
print p
Jego output wygląda następująco -
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 5 (minor_axis)
Items axis: 0 to 1
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 4
Note - Zwróć uwagę na wymiary pustego panelu i panelu powyżej, wszystkie obiekty są różne.
Z dyktowania obiektów DataFrame
#creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p
Jego output wygląda następująco -
Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 2
Utwórz pusty panel
Pusty panel można utworzyć za pomocą konstruktora Panel w następujący sposób -
#creating an empty panel
import pandas as pd
p = pd.Panel()
print p
Jego output wygląda następująco -
<class 'pandas.core.panel.Panel'>
Dimensions: 0 (items) x 0 (major_axis) x 0 (minor_axis)
Items axis: None
Major_axis axis: None
Minor_axis axis: None
Wybór danych z panelu
Wybierz dane z panelu za pomocą -
- Items
- Major_axis
- Minor_axis
Korzystanie z przedmiotów
# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p['Item1']
Jego output wygląda następująco -
0 1 2
0 0.488224 -0.128637 0.930817
1 0.417497 0.896681 0.576657
2 -2.775266 0.571668 0.290082
3 -0.400538 -0.144234 1.110535
Mamy dwie pozycje i pobraliśmy item1. Rezultatem jest DataFrame z 4 wierszami i 3 kolumnami, które sąMajor_axis and Minor_axis dimensions.
Using major_axis
Data can be accessed using the method panel.major_axis(index).
# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p.major_xs(1)
Its output is as follows −
Item1 Item2
0 0.417497 0.748412
1 0.896681 -0.557322
2 0.576657 NaN
Using minor_axis
Data can be accessed using the method panel.minor_axis(index).
# creating an empty panel
import pandas as pd
import numpy as np
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
p = pd.Panel(data)
print p.minor_xs(1)
Its output is as follows −
Item1 Item2
0 -0.128637 -1.047032
1 0.896681 -0.557322
2 0.571668 0.431953
3 -0.144234 1.302466
Note − Observe the changes in the dimensions.
By now, we learnt about the three Pandas DataStructures and how to create them. We will majorly focus on the DataFrame objects because of its importance in the real time data processing and also discuss a few other DataStructures.
Series Basic Functionality
Sr.No. | Attribute or Method & Description |
---|---|
1 | axes Returns a list of the row axis labels |
2 | dtype Returns the dtype of the object. |
3 | empty Returns True if series is empty. |
4 | ndim Returns the number of dimensions of the underlying data, by definition 1. |
5 | size Returns the number of elements in the underlying data. |
6 | values Returns the Series as ndarray. |
7 | head() Returns the first n rows. |
8 | tail() Returns the last n rows. |
Let us now create a Series and see all the above tabulated attributes operation.
Example
import pandas as pd
import numpy as np
#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print s
Its output is as follows −
0 0.967853
1 -0.148368
2 -1.395906
3 -1.758394
dtype: float64
axes
Returns the list of the labels of the series.
import pandas as pd
import numpy as np
#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print ("The axes are:")
print s.axes
Its output is as follows −
The axes are:
[RangeIndex(start=0, stop=4, step=1)]
The above result is a compact format of a list of values from 0 to 5, i.e., [0,1,2,3,4].
empty
Returns the Boolean value saying whether the Object is empty or not. True indicates that the object is empty.
import pandas as pd
import numpy as np
#Create a series with 100 random numbers
s = pd.Series(np.random.randn(4))
print ("Is the Object empty?")
print s.empty
Its output is as follows −
Is the Object empty?
False
ndim
Returns the number of dimensions of the object. By definition, a Series is a 1D data structure, so it returns
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print s
print ("The dimensions of the object:")
print s.ndim
Its output is as follows −
0 0.175898
1 0.166197
2 -0.609712
3 -1.377000
dtype: float64
The dimensions of the object:
1
size
Returns the size(length) of the series.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(2))
print s
print ("The size of the object:")
print s.size
Its output is as follows −
0 3.078058
1 -1.207803
dtype: float64
The size of the object:
2
values
Returns the actual data in the series as an array.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print s
print ("The actual data series is:")
print s.values
Its output is as follows −
0 1.787373
1 -0.605159
2 0.180477
3 -0.140922
dtype: float64
The actual data series is:
[ 1.78737302 -0.60515881 0.18047664 -0.1409218 ]
Head & Tail
To view a small sample of a Series or the DataFrame object, use the head() and the tail() methods.
head() returns the first n rows(observe the index values). The default number of elements to display is five, but you may pass a custom number.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print ("The original series is:")
print s
print ("The first two rows of the data series:")
print s.head(2)
Its output is as follows −
The original series is:
0 0.720876
1 -0.765898
2 0.479221
3 -0.139547
dtype: float64
The first two rows of the data series:
0 0.720876
1 -0.765898
dtype: float64
tail() returns the last n rows(observe the index values). The default number of elements to display is five, but you may pass a custom number.
import pandas as pd
import numpy as np
#Create a series with 4 random numbers
s = pd.Series(np.random.randn(4))
print ("The original series is:")
print s
print ("The last two rows of the data series:")
print s.tail(2)
Its output is as follows −
The original series is:
0 -0.655091
1 -0.881407
2 -0.608592
3 -2.341413
dtype: float64
The last two rows of the data series:
2 -0.608592
3 -2.341413
dtype: float64
DataFrame Basic Functionality
Let us now understand what DataFrame Basic Functionality is. The following tables lists down the important attributes or methods that help in DataFrame Basic Functionality.
Sr.No. | Attribute or Method & Description |
---|---|
1 | T Transposes rows and columns. |
2 | axes Returns a list with the row axis labels and column axis labels as the only members. |
3 | dtypes Returns the dtypes in this object. |
4 | empty True if NDFrame is entirely empty [no items]; if any of the axes are of length 0. |
5 | ndim Number of axes / array dimensions. |
6 | shape Returns a tuple representing the dimensionality of the DataFrame. |
7 | size Number of elements in the NDFrame. |
8 | values Numpy representation of NDFrame. |
9 | head() Returns the first n rows. |
10 | tail() Returns last n rows. |
Let us now create a DataFrame and see all how the above mentioned attributes operate.
Example
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data series is:")
print df
Its output is as follows −
Our data series is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
T (Transpose)
Returns the transpose of the DataFrame. The rows and columns will interchange.
import pandas as pd
import numpy as np
# Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
# Create a DataFrame
df = pd.DataFrame(d)
print ("The transpose of the data series is:")
print df.T
Its output is as follows −
The transpose of the data series is:
0 1 2 3 4 5 6
Age 25 26 25 23 30 29 23
Name Tom James Ricky Vin Steve Smith Jack
Rating 4.23 3.24 3.98 2.56 3.2 4.6 3.8
axes
Returns the list of row axis labels and column axis labels.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Row axis labels and column axis labels are:")
print df.axes
Its output is as follows −
Row axis labels and column axis labels are:
[RangeIndex(start=0, stop=7, step=1), Index([u'Age', u'Name', u'Rating'],
dtype='object')]
dtypes
Returns the data type of each column.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("The data types of each column are:")
print df.dtypes
Its output is as follows −
The data types of each column are:
Age int64
Name object
Rating float64
dtype: object
empty
Returns the Boolean value saying whether the Object is empty or not; True indicates that the object is empty.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Is the object empty?")
print df.empty
Its output is as follows −
Is the object empty?
False
ndim
Returns the number of dimensions of the object. By definition, DataFrame is a 2D object.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The dimension of the object is:")
print df.ndim
Its output is as follows −
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The dimension of the object is:
2
shape
Returns a tuple representing the dimensionality of the DataFrame. Tuple (a,b), where a represents the number of rows and b represents the number of columns.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The shape of the object is:")
print df.shape
Its output is as follows −
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The shape of the object is:
(7, 3)
size
Returns the number of elements in the DataFrame.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The total number of elements in our object is:")
print df.size
Its output is as follows −
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The total number of elements in our object is:
21
values
Returns the actual data in the DataFrame as an NDarray.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our object is:")
print df
print ("The actual data in our data frame is:")
print df.values
Its output is as follows −
Our object is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The actual data in our data frame is:
[[25 'Tom' 4.23]
[26 'James' 3.24]
[25 'Ricky' 3.98]
[23 'Vin' 2.56]
[30 'Steve' 3.2]
[29 'Smith' 4.6]
[23 'Jack' 3.8]]
Head & Tail
To view a small sample of a DataFrame object, use the head() and tail() methods. head() returns the first n rows (observe the index values). The default number of elements to display is five, but you may pass a custom number.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data frame is:")
print df
print ("The first two rows of the data frame is:")
print df.head(2)
Its output is as follows −
Our data frame is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The first two rows of the data frame is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
tail() returns the last n rows (observe the index values). The default number of elements to display is five, but you may pass a custom number.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack']),
'Age':pd.Series([25,26,25,23,30,29,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#Create a DataFrame
df = pd.DataFrame(d)
print ("Our data frame is:")
print df
print ("The last two rows of the data frame is:")
print df.tail(2)
Its output is as follows −
Our data frame is:
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
The last two rows of the data frame is:
Age Name Rating
5 29 Smith 4.6
6 23 Jack 3.8
A large number of methods collectively compute descriptive statistics and other related operations on DataFrame. Most of these are aggregations like sum(), mean(), but some of them, like sumsum(), produce an object of the same size. Generally speaking, these methods take an axis argument, just like ndarray.{sum, std, ...}, but the axis can be specified by name or integer
DataFrame − “index” (axis=0, default), “columns” (axis=1)
Let us create a DataFrame and use this object throughout this chapter for all the operations.
Example
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df
Its output is as follows −
Age Name Rating
0 25 Tom 4.23
1 26 James 3.24
2 25 Ricky 3.98
3 23 Vin 2.56
4 30 Steve 3.20
5 29 Smith 4.60
6 23 Jack 3.80
7 34 Lee 3.78
8 40 David 2.98
9 30 Gasper 4.80
10 51 Betina 4.10
11 46 Andres 3.65
sum()
Returns the sum of the values for the requested axis. By default, axis is index (axis=0).
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.sum()
Its output is as follows −
Age 382
Name TomJamesRickyVinSteveSmithJackLeeDavidGasperBe...
Rating 44.92
dtype: object
Each individual column is added individually (Strings are appended).
axis=1
This syntax will give the output as shown below.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.sum(1)
Jego output wygląda następująco -
0 29.23
1 29.24
2 28.98
3 25.56
4 33.20
5 33.60
6 26.80
7 37.78
8 42.98
9 34.80
10 55.10
11 49.65
dtype: float64
oznaczać()
Zwraca średnią wartość
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.mean()
Jego output wygląda następująco -
Age 31.833333
Rating 3.743333
dtype: float64
std ()
Zwraca odchylenie standardowe Bressela z kolumn liczbowych.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.std()
Jego output wygląda następująco -
Age 9.232682
Rating 0.661628
dtype: float64
Funkcje i opis
Przyjrzyjmy się teraz funkcjom w sekcji Statystyki opisowe w Python Pandas. W poniższej tabeli wymieniono ważne funkcje -
Sr.No. | Funkcjonować | Opis |
---|---|---|
1 | liczyć() | Liczba obserwacji niezerowych |
2 | suma() | Suma wartości |
3 | oznaczać() | Średnia wartości |
4 | mediana() | Mediana wartości |
5 | tryb() | Tryb wartości |
6 | std () | Odchylenie standardowe wartości |
7 | min () | Minimalna wartość |
8 | max () | Maksymalna wartość |
9 | abs () | Całkowita wartość |
10 | szturchać() | Produkt wartości |
11 | cumsum () | Suma skumulowana |
12 | cumprod () | Produkt zbiorczy |
Note- Ponieważ DataFrame jest heterogeniczną strukturą danych. Operacje ogólne nie działają ze wszystkimi funkcjami.
Funkcje takie jak sum(), cumsum()działają z elementami danych liczbowymi i znakowymi (lub) bez żadnego błędu. Chociażn W praktyce agregacje znaków nie są generalnie używane, funkcje te nie zgłaszają żadnych wyjątków.
Funkcje takie jak abs(), cumprod() zgłoś wyjątek, gdy DataFrame zawiera dane znakowe lub ciągowe, ponieważ nie można wykonać takich operacji.
Podsumowanie danych
Plik describe() funkcja oblicza podsumowanie statystyk dotyczących kolumn DataFrame.
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.describe()
Jego output wygląda następująco -
Age Rating
count 12.000000 12.000000
mean 31.833333 3.743333
std 9.232682 0.661628
min 23.000000 2.560000
25% 25.000000 3.230000
50% 29.500000 3.790000
75% 35.500000 4.132500
max 51.000000 4.800000
Ta funkcja daje mean, std i IQRwartości. Funkcja wyklucza kolumny znakowe i dane podsumowanie dotyczące kolumn numerycznych.'include'jest argumentem używanym do przekazywania niezbędnych informacji dotyczących kolumn, które należy uwzględnić przy podsumowaniu. Przyjmuje listę wartości; domyślnie „numer”.
- object - Podsumowuje kolumny typu String
- number - Podsumowuje kolumny liczbowe
- all - Podsumowuje wszystkie kolumny razem (nie powinien przekazywać go jako wartości listy)
Teraz użyj poniższej instrukcji w programie i sprawdź dane wyjściowe -
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df.describe(include=['object'])
Jego output wygląda następująco -
Name
count 12
unique 12
top Ricky
freq 1
Teraz użyj poniższej instrukcji i sprawdź dane wyjściowe -
import pandas as pd
import numpy as np
#Create a Dictionary of series
d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack',
'Lee','David','Gasper','Betina','Andres']),
'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])
}
#Create a DataFrame
df = pd.DataFrame(d)
print df. describe(include='all')
Jego output wygląda następująco -
Age Name Rating
count 12.000000 12 12.000000
unique NaN 12 NaN
top NaN Ricky NaN
freq NaN 1 NaN
mean 31.833333 NaN 3.743333
std 9.232682 NaN 0.661628
min 23.000000 NaN 2.560000
25% 25.000000 NaN 3.230000
50% 29.500000 NaN 3.790000
75% 35.500000 NaN 4.132500
max 51.000000 NaN 4.800000
Aby zastosować funkcje własne lub innej biblioteki do obiektów Pandas, powinieneś być świadomy trzech ważnych metod. Metody zostały omówione poniżej. Odpowiednia metoda zależy od tego, czy funkcja ma działać na całym DataFrame, wierszach lub kolumnach, czy elementach.
- Tabela mądry Zastosowanie funkcji: pipe ()
- Aplikacja funkcji wiersza lub kolumny: zastosuj ()
- Element mądry Aplikacja funkcji: applymap ()
Aplikacja funkcji tabelarycznej
Operacje niestandardowe można wykonać, przekazując funkcję i odpowiednią liczbę parametrów jako argumenty potoku. W ten sposób operacja jest wykonywana na całym DataFrame.
Na przykład dodaj wartość 2 do wszystkich elementów w DataFrame. Następnie,
funkcja sumatora
Funkcja sumująca dodaje dwie wartości liczbowe jako parametry i zwraca sumę.
def adder(ele1,ele2):
return ele1+ele2
Będziemy teraz używać funkcji niestandardowej do wykonywania operacji na DataFrame.
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.pipe(adder,2)
Zobaczmy pełny program -
import pandas as pd
import numpy as np
def adder(ele1,ele2):
return ele1+ele2
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.pipe(adder,2)
print df.apply(np.mean)
Jego output wygląda następująco -
col1 col2 col3
0 2.176704 2.219691 1.509360
1 2.222378 2.422167 3.953921
2 2.241096 1.135424 2.696432
3 2.355763 0.376672 1.182570
4 2.308743 2.714767 2.130288
Aplikacja funkcji wiersza lub kolumny
Arbitralne funkcje można stosować wzdłuż osi DataFrame lub Panel przy użyciu apply()metoda, która, podobnie jak opisowe metody statystyczne, przyjmuje opcjonalny argument osi. Domyślnie operacja jest wykonywana według kolumn, przyjmując każdą kolumnę jako tablicę.
Przykład 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(np.mean)
print df.apply(np.mean)
Jego output wygląda następująco -
col1 -0.288022
col2 1.044839
col3 -0.187009
dtype: float64
Mijając axis parametr, operacje mogą być wykonywane wierszowo.
Przykład 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(np.mean,axis=1)
print df.apply(np.mean)
Jego output wygląda następująco -
col1 0.034093
col2 -0.152672
col3 -0.229728
dtype: float64
Przykład 3
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(lambda x: x.max() - x.min())
print df.apply(np.mean)
Jego output wygląda następująco -
col1 -0.167413
col2 -0.370495
col3 -0.707631
dtype: float64
Aplikacja funkcji Element Wise
Nie wszystkie funkcje można wektoryzować (ani tablice NumPy, które zwracają inną tablicę ani żadną wartość), metody applymap() w DataFrame i analogously map() on Series akceptuje każdą funkcję Pythona pobierającą jedną wartość i zwracającą jedną wartość.
Przykład 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
# My custom function
df['col1'].map(lambda x:x*100)
print df.apply(np.mean)
Jego output wygląda następująco -
col1 0.480742
col2 0.454185
col3 0.266563
dtype: float64
Przykład 2
import pandas as pd
import numpy as np
# My custom function
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.applymap(lambda x:x*100)
print df.apply(np.mean)
Jego output wygląda następująco -
col1 0.395263
col2 0.204418
col3 -0.795188
dtype: float64
Reindexingzmienia etykiety wierszy i kolumn DataFrame. Aby reindex środki do zgodnych danych dopasować dany zestaw etykiet wzdłuż określonej osi.
Wiele operacji można wykonać poprzez indeksowanie, takie jak -
Zmień kolejność istniejących danych, aby dopasować je do nowego zestawu etykiet.
Wstaw znaczniki brakujących wartości (NA) w lokalizacjach etykiet, w których nie było danych dla etykiety.
Przykład
import pandas as pd
import numpy as np
N=20
df = pd.DataFrame({
'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
'x': np.linspace(0,stop=N-1,num=N),
'y': np.random.rand(N),
'C': np.random.choice(['Low','Medium','High'],N).tolist(),
'D': np.random.normal(100, 10, size=(N)).tolist()
})
#reindex the DataFrame
df_reindexed = df.reindex(index=[0,2,5], columns=['A', 'C', 'B'])
print df_reindexed
Jego output wygląda następująco -
A C B
0 2016-01-01 Low NaN
2 2016-01-03 High NaN
5 2016-01-06 Low NaN
Zindeksuj ponownie, aby wyrównać z innymi obiektami
Możesz chcieć wziąć obiekt i ponownie zindeksować jego osie, aby uzyskać taką samą etykietę jak inny obiekt. Rozważ następujący przykład, aby zrozumieć to samo.
Przykład
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(10,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(7,3),columns=['col1','col2','col3'])
df1 = df1.reindex_like(df2)
print df1
Jego output wygląda następująco -
col1 col2 col3
0 -2.467652 -1.211687 -0.391761
1 -0.287396 0.522350 0.562512
2 -0.255409 -0.483250 1.866258
3 -1.150467 -0.646493 -0.222462
4 0.152768 -2.056643 1.877233
5 -1.155997 1.528719 -1.343719
6 -1.015606 -1.245936 -0.295275
Note - Tutaj df1 DataFrame jest zmieniana i reindeksowana jak df2. Nazwy kolumn powinny być dopasowane, w przeciwnym razie NAN zostanie dodane do całej etykiety kolumny.
Wypełnianie podczas ponownego indeksowania
reindex() przyjmuje opcjonalną metodę parametru, która jest metodą wypełniania z następującymi wartościami -
pad/ffill - Wypełnij wartości do przodu
bfill/backfill - Wypełnij wartości wstecz
nearest - Wypełnij od najbliższych wartości indeksu
Przykład
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
# Padding NAN's
print df2.reindex_like(df1)
# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill:")
print df2.reindex_like(df1,method='ffill')
Jego output wygląda następująco -
col1 col2 col3
0 1.311620 -0.707176 0.599863
1 -0.423455 -0.700265 1.133371
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Data Frame with Forward Fill:
col1 col2 col3
0 1.311620 -0.707176 0.599863
1 -0.423455 -0.700265 1.133371
2 -0.423455 -0.700265 1.133371
3 -0.423455 -0.700265 1.133371
4 -0.423455 -0.700265 1.133371
5 -0.423455 -0.700265 1.133371
Note - Ostatnie cztery rzędy są wyściełane.
Ograniczenia dotyczące wypełniania podczas ponownego indeksowania
Argument limit zapewnia dodatkową kontrolę nad wypełnianiem podczas ponownego indeksowania. Limit określa maksymalną liczbę kolejnych dopasowań. Rozważmy następujący przykład, aby zrozumieć to samo -
Przykład
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
df2 = pd.DataFrame(np.random.randn(2,3),columns=['col1','col2','col3'])
# Padding NAN's
print df2.reindex_like(df1)
# Now Fill the NAN's with preceding Values
print ("Data Frame with Forward Fill limiting to 1:")
print df2.reindex_like(df1,method='ffill',limit=1)
Jego output wygląda następująco -
col1 col2 col3
0 0.247784 2.128727 0.702576
1 -0.055713 -0.021732 -0.174577
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Data Frame with Forward Fill limiting to 1:
col1 col2 col3
0 0.247784 2.128727 0.702576
1 -0.055713 -0.021732 -0.174577
2 -0.055713 -0.021732 -0.174577
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Note- Zauważ, że tylko siódmy wiersz jest wypełniony przez poprzedni szósty wiersz. Następnie rzędy pozostawia się bez zmian.
Zmiana nazwy
Metoda rename () umożliwia zmianę etykiety osi na podstawie jakiegoś odwzorowania (dykt lub Seria) lub dowolnej funkcji.
Rozważmy następujący przykład, aby to zrozumieć -
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.random.randn(6,3),columns=['col1','col2','col3'])
print df1
print ("After renaming the rows and columns:")
print df1.rename(columns={'col1' : 'c1', 'col2' : 'c2'},
index = {0 : 'apple', 1 : 'banana', 2 : 'durian'})
Jego output wygląda następująco -
col1 col2 col3
0 0.486791 0.105759 1.540122
1 -0.990237 1.007885 -0.217896
2 -0.483855 -1.645027 -1.194113
3 -0.122316 0.566277 -0.366028
4 -0.231524 -0.721172 -0.112007
5 0.438810 0.000225 0.435479
After renaming the rows and columns:
c1 c2 col3
apple 0.486791 0.105759 1.540122
banana -0.990237 1.007885 -0.217896
durian -0.483855 -1.645027 -1.194113
3 -0.122316 0.566277 -0.366028
4 -0.231524 -0.721172 -0.112007
5 0.438810 0.000225 0.435479
Metoda rename () zapewnia rozszerzenie inplacenazwany parametr, który domyślnie ma wartość False i kopiuje podstawowe dane. Przechodzićinplace=True aby zmienić nazwę danych w miejscu.
Zachowanie podstawowej iteracji na obiektach Pandas zależy od typu. Podczas iteracji po serii jest ona traktowana jako tablica, a podstawowa iteracja generuje wartości. Inne struktury danych, takie jak DataFrame i Panel, są zgodne zdict-like konwencja iteracji po keys obiektów.
Krótko mówiąc, podstawowa iteracja (dla i w obiekcie) produkuje -
Series - wartości
DataFrame - etykiety kolumn
Panel - etykiety przedmiotów
Iterowanie ramki DataFrame
Iteracja DataFrame daje nazwy kolumn. Rozważmy następujący przykład, aby zrozumieć to samo.
import pandas as pd
import numpy as np
N=20
df = pd.DataFrame({
'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
'x': np.linspace(0,stop=N-1,num=N),
'y': np.random.rand(N),
'C': np.random.choice(['Low','Medium','High'],N).tolist(),
'D': np.random.normal(100, 10, size=(N)).tolist()
})
for col in df:
print col
Jego output wygląda następująco -
A
C
D
x
y
Aby iterować po wierszach DataFrame, możemy użyć następujących funkcji -
iteritems() - iterować po parach (klucz, wartość)
iterrows() - iteruj po wierszach jako pary (indeks, seria)
itertuples() - iteruj po wierszach jako nazwane krotki
iteritems ()
Iteruje po każdej kolumnie jako klucz, para wartości z etykietą jako klucz i wartość kolumny jako obiekt Series.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns=['col1','col2','col3'])
for key,value in df.iteritems():
print key,value
Jego output wygląda następująco -
col1 0 0.802390
1 0.324060
2 0.256811
3 0.839186
Name: col1, dtype: float64
col2 0 1.624313
1 -1.033582
2 1.796663
3 1.856277
Name: col2, dtype: float64
col3 0 -0.022142
1 -0.230820
2 1.160691
3 -0.830279
Name: col3, dtype: float64
Zauważ, że każda kolumna jest iterowana osobno jako para klucz-wartość w serii.
iterrows ()
iterrows () zwraca iterator zwracający każdą wartość indeksu wraz z serią zawierającą dane w każdym wierszu.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row_index,row in df.iterrows():
print row_index,row
Jego output wygląda następująco -
0 col1 1.529759
col2 0.762811
col3 -0.634691
Name: 0, dtype: float64
1 col1 -0.944087
col2 1.420919
col3 -0.507895
Name: 1, dtype: float64
2 col1 -0.077287
col2 -0.858556
col3 -0.663385
Name: 2, dtype: float64
3 col1 -1.638578
col2 0.059866
col3 0.493482
Name: 3, dtype: float64
Note - Ponieważ iterrows()iteruje po wierszach, nie zachowuje typu danych w wierszu. 0,1,2 to indeksy wierszy, a col1, col2, col3 to indeksy kolumn.
itertuples ()
itertuples () zwróci iterator zwracający nazwaną krotkę dla każdego wiersza w DataFrame. Pierwszym elementem krotki będzie odpowiednia wartość indeksu wiersza, a pozostałe wartości to wartości wiersza.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row in df.itertuples():
print row
Jego output wygląda następująco -
Pandas(Index=0, col1=1.5297586201375899, col2=0.76281127433814944, col3=-
0.6346908238310438)
Pandas(Index=1, col1=-0.94408735763808649, col2=1.4209186418359423, col3=-
0.50789517967096232)
Pandas(Index=2, col1=-0.07728664756791935, col2=-0.85855574139699076, col3=-
0.6633852507207626)
Pandas(Index=3, col1=0.65734942534106289, col2=-0.95057710432604969,
col3=0.80344487462316527)
Note- Nie próbuj modyfikować żadnego obiektu podczas iteracji. Iteracja jest przeznaczona do czytania, a iterator zwraca kopię oryginalnego obiektu (widoku), więc zmiany nie będą odzwierciedlać oryginalnego obiektu.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for index, row in df.iterrows():
row['a'] = 10
print df
Jego output wygląda następująco -
col1 col2 col3
0 -1.739815 0.735595 -0.295589
1 0.635485 0.106803 1.527922
2 -0.939064 0.547095 0.038585
3 -1.016509 -0.116580 -0.523158
Obserwuj, żadnych zmian nie widać.
W Pandas dostępne są dwa rodzaje sortowania. Oni są -
- Według etykiety
- Rzeczywista wartość
Rozważmy przykład z wyjściem.
import pandas as pd
import numpy as np
unsorted_df=pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns=['col2','col1'])
print unsorted_df
Jego output wygląda następująco -
col2 col1
1 -2.063177 0.537527
4 0.142932 -0.684884
6 0.012667 -0.389340
2 -0.548797 1.848743
3 -1.044160 0.837381
5 0.385605 1.300185
9 1.031425 -1.002967
8 -0.407374 -0.435142
0 2.237453 -1.067139
7 -1.445831 -1.701035
W unsorted_df, the labels i valuessą nieposortowane. Zobaczmy, jak można je posortować.
Według etykiety
Używając sort_index()metoda, przekazując argumenty osi i kolejność sortowania, można sortować DataFrame. Domyślnie sortowanie jest wykonywane na etykietach wierszy w kolejności rosnącej.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns = ['col2','col1'])
sorted_df=unsorted_df.sort_index()
print sorted_df
Jego output wygląda następująco -
col2 col1
0 0.208464 0.627037
1 0.641004 0.331352
2 -0.038067 -0.464730
3 -0.638456 -0.021466
4 0.014646 -0.737438
5 -0.290761 -1.669827
6 -0.797303 -0.018737
7 0.525753 1.628921
8 -0.567031 0.775951
9 0.060724 -0.322425
Kolejność sortowania
Przekazując wartość logiczną do parametru rosnącego, można kontrolować kolejność sortowania. Rozważmy następujący przykład, aby zrozumieć to samo.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns = ['col2','col1'])
sorted_df = unsorted_df.sort_index(ascending=False)
print sorted_df
Jego output wygląda następująco -
col2 col1
9 0.825697 0.374463
8 -1.699509 0.510373
7 -0.581378 0.622958
6 -0.202951 0.954300
5 -1.289321 -1.551250
4 1.302561 0.851385
3 -0.157915 -0.388659
2 -1.222295 0.166609
1 0.584890 -0.291048
0 0.668444 -0.061294
Sortuj kolumny
Przekazując argument osi o wartości 0 lub 1, sortowanie można przeprowadzić na etykietach kolumn. Domyślnie axis = 0, sortuj według wiersza. Rozważmy następujący przykład, aby zrozumieć to samo.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],colu
mns = ['col2','col1'])
sorted_df=unsorted_df.sort_index(axis=1)
print sorted_df
Jego output wygląda następująco -
col1 col2
1 -0.291048 0.584890
4 0.851385 1.302561
6 0.954300 -0.202951
2 0.166609 -1.222295
3 -0.388659 -0.157915
5 -1.551250 -1.289321
9 0.374463 0.825697
8 0.510373 -1.699509
0 -0.061294 0.668444
7 0.622958 -0.581378
Według wartości
Jak sortowanie indeksów, sort_values()to metoda sortowania według wartości. Akceptuje argument „by”, który będzie używał nazwy kolumny DataFrame, z którą mają być sortowane wartości.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1')
print sorted_df
Jego output wygląda następująco -
col1 col2
1 1 3
2 1 2
3 1 4
0 2 1
Obserwuj, wartości col1 są sortowane, a odpowiednia wartość col2 i indeks wiersza będą się zmieniać wraz z col1. Dlatego wyglądają na niesortowane.
'by' argument przyjmuje listę wartości kolumn.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by=['col1','col2'])
print sorted_df
Jego output wygląda następująco -
col1 col2
2 1 2
1 1 3
3 1 4
0 2 1
Algorytm sortowania
sort_values()zapewnia możliwość wyboru algorytmu z łączenia, heapsort i quicksort. Mergesort to jedyny stabilny algorytm.
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1' ,kind='mergesort')
print sorted_df
Jego output wygląda następująco -
col1 col2
1 1 3
2 1 2
3 1 4
0 2 1
W tym rozdziale omówimy operacje na łańcuchach z naszą podstawową serią / indeksem. W kolejnych rozdziałach nauczymy się, jak zastosować te funkcje łańcuchowe w DataFrame.
Pandas udostępnia zestaw funkcji tekstowych, które ułatwiają operowanie na danych łańcuchowych. Co najważniejsze, te funkcje ignorują (lub wykluczają) brakujące / NaN wartości.
Prawie wszystkie te metody działają z funkcjami tekstowymi w języku Python (patrz: https://docs.python.org/3/library/stdtypes.html#string-methods). Więc przekonwertuj obiekt Series na obiekt typu String, a następnie wykonaj operację.
Zobaczmy teraz, jak przebiega każda operacja.
Sr.No | Opis funkcji |
---|---|
1 | lower() Konwertuje ciągi w Serii / Indeksie na małe litery. |
2 | upper() Konwertuje ciągi w Serii / Indeksie na wielkie litery. |
3 | len() Oblicza długość ciągu (). |
4 | strip() Pomaga usunąć białe znaki (w tym znak nowej linii) z każdego ciągu w serii / indeksie z obu stron. |
5 | split(' ') Dzieli każdy ciąg z podanym wzorem. |
6 | cat(sep=' ') Łączy elementy serii / indeksu z podanym separatorem. |
7 | get_dummies() Zwraca DataFrame z wartościami One-Hot Encoded. |
8 | contains(pattern) Zwraca wartość logiczną True dla każdego elementu, jeśli podciąg zawiera element, w przeciwnym razie False. |
9 | replace(a,b) Zastępuje wartość a z wartością b. |
10 | repeat(value) Powtarza każdy element określoną liczbę razy. |
11 | count(pattern) Zwraca liczbę pojawiania się wzorca w każdym elemencie. |
12 | startswith(pattern) Zwraca wartość true, jeśli element w serii / indeksie zaczyna się od wzorca. |
13 | endswith(pattern) Zwraca wartość true, jeśli element w serii / indeksie kończy się wzorem. |
14 | find(pattern) Zwraca pierwszą pozycję pierwszego wystąpienia wzorca. |
15 | findall(pattern) Zwraca listę wszystkich wystąpień wzorca. |
16 | swapcase Zamienia małe / duże litery. |
17 | islower() Sprawdza, czy wszystkie znaki w każdym ciągu w serii / indeksie są małymi literami, czy nie. Zwraca wartość logiczną |
18 | isupper() Sprawdza, czy wszystkie znaki w każdym ciągu w serii / indeksie są dużymi literami, czy nie. Zwraca wartość logiczną. |
19 | isnumeric() Sprawdza, czy wszystkie znaki w każdym ciągu w serii / indeksie są numeryczne. Zwraca wartość logiczną. |
Stwórzmy teraz serię i zobaczmy, jak działają wszystkie powyższe funkcje.
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s
Jego output wygląda następująco -
0 Tom
1 William Rick
2 John
3 Alber@t
4 NaN
5 1234
6 Steve Smith
dtype: object
niższy()
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s.str.lower()
Jego output wygląda następująco -
0 tom
1 william rick
2 john
3 alber@t
4 NaN
5 1234
6 steve smith
dtype: object
górny()
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s.str.upper()
Jego output wygląda następująco -
0 TOM
1 WILLIAM RICK
2 JOHN
3 ALBER@T
4 NaN
5 1234
6 STEVE SMITH
dtype: object
len ()
import pandas as pd
import numpy as np
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveSmith'])
print s.str.len()
Jego output wygląda następująco -
0 3.0
1 12.0
2 4.0
3 7.0
4 NaN
5 4.0
6 10.0
dtype: float64
rozebrać się()
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("After Stripping:")
print s.str.strip()
Jego output wygląda następująco -
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
After Stripping:
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
podział (wzór)
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("Split Pattern:")
print s.str.split(' ')
Jego output wygląda następująco -
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
Split Pattern:
0 [Tom, , , , , , , , , , ]
1 [, , , , , William, Rick]
2 [John]
3 [Alber@t]
dtype: object
kot (sep = wzór)
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.cat(sep='_')
Jego output wygląda następująco -
Tom _ William Rick_John_Alber@t
get_dummies ()
import pandas as pd
import numpy as np
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.get_dummies()
Jego output wygląda następująco -
William Rick Alber@t John Tom
0 0 0 0 1
1 1 0 0 0
2 0 0 1 0
3 0 1 0 0
zawiera ()
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.contains(' ')
Jego output wygląda następująco -
0 True
1 True
2 False
3 False
dtype: bool
wymienić (a, b)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s
print ("After replacing @ with $:") print s.str.replace('@','$')
Jego output wygląda następująco -
0 Tom
1 William Rick
2 John
3 Alber@t
dtype: object
After replacing @ with $: 0 Tom 1 William Rick 2 John 3 Alber$t
dtype: object
powtórzyć (wartość)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.repeat(2)
Jego output wygląda następująco -
0 Tom Tom
1 William Rick William Rick
2 JohnJohn
3 Alber@tAlber@t
dtype: object
count (wzorzec)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print ("The number of 'm's in each string:")
print s.str.count('m')
Jego output wygląda następująco -
The number of 'm's in each string:
0 1
1 1
2 0
3 0
zaczyna się (wzór)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print ("Strings that start with 'T':")
print s.str. startswith ('T')
Jego output wygląda następująco -
0 True
1 False
2 False
3 False
dtype: bool
endwith (wzór)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print ("Strings that end with 't':")
print s.str.endswith('t')
Jego output wygląda następująco -
Strings that end with 't':
0 False
1 False
2 False
3 True
dtype: bool
znajdź (wzór)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.find('e')
Jego output wygląda następująco -
0 -1
1 -1
2 -1
3 3
dtype: int64
„-1” oznacza, że w elemencie nie ma takiego wzorca.
findall (wzór)
import pandas as pd
s = pd.Series(['Tom ', ' William Rick', 'John', 'Alber@t'])
print s.str.findall('e')
Jego output wygląda następująco -
0 []
1 []
2 []
3 [e]
dtype: object
Lista pusta ([]) wskazuje, że w elemencie nie ma takiego wzorca.
swapcase ()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.swapcase()
Jego output wygląda następująco -
0 tOM
1 wILLIAM rICK
2 jOHN
3 aLBER@T
dtype: object
islower ()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.islower()
Jego output wygląda następująco -
0 False
1 False
2 False
3 False
dtype: bool
isupper ()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.isupper()
Jego output wygląda następująco -
0 False
1 False
2 False
3 False
dtype: bool
isnumeric ()
import pandas as pd
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t'])
print s.str.isnumeric()
Jego output wygląda następująco -
0 False
1 False
2 False
3 False
dtype: bool
Pandy zapewniają API do dostosowywania niektórych aspektów jego zachowania, najczęściej używany jest wyświetlacz.
API składa się z pięciu odpowiednich funkcji. Oni są -
- get_option()
- set_option()
- reset_option()
- describe_option()
- option_context()
Zrozummy teraz, jak działają te funkcje.
get_option (parametr)
get_option przyjmuje pojedynczy parametr i zwraca wartość podaną w danych wyjściowych poniżej -
display.max_rows
Wyświetla domyślną liczbę wartości. Interpreter odczytuje tę wartość i wyświetla wiersze z tą wartością jako górną granicą do wyświetlenia.
import pandas as pd
print pd.get_option("display.max_rows")
Jego output wygląda następująco -
60
display.max_columns
Wyświetla domyślną liczbę wartości. Interpreter odczytuje tę wartość i wyświetla wiersze z tą wartością jako górną granicą do wyświetlenia.
import pandas as pd
print pd.get_option("display.max_columns")
Jego output wygląda następująco -
20
Tutaj 60 i 20 to domyślne wartości parametrów konfiguracyjnych.
set_option (parametr, wartość)
set_option przyjmuje dwa argumenty i ustawia wartość na parametr, jak pokazano poniżej -
display.max_rows
Za pomocą set_option(), możemy zmienić domyślną liczbę wyświetlanych wierszy.
import pandas as pd
pd.set_option("display.max_rows",80)
print pd.get_option("display.max_rows")
Jego output wygląda następująco -
80
display.max_columns
Za pomocą set_option(), możemy zmienić domyślną liczbę wyświetlanych wierszy.
import pandas as pd
pd.set_option("display.max_columns",30)
print pd.get_option("display.max_columns")
Jego output wygląda następująco -
30
reset_option (parametr)
reset_option przyjmuje argument i ustawia wartość z powrotem na wartość domyślną.
display.max_rows
Używając reset_option (), możemy zmienić wartość z powrotem na domyślną liczbę wyświetlanych wierszy.
import pandas as pd
pd.reset_option("display.max_rows")
print pd.get_option("display.max_rows")
Jego output wygląda następująco -
60
opisać_opcję (parametr)
describe_option wypisuje opis argumentu.
display.max_rows
Używając reset_option (), możemy zmienić wartość z powrotem na domyślną liczbę wyświetlanych wierszy.
import pandas as pd
pd.describe_option("display.max_rows")
Jego output wygląda następująco -
display.max_rows : int
If max_rows is exceeded, switch to truncate view. Depending on
'large_repr', objects are either centrally truncated or printed as
a summary view. 'None' value means unlimited.
In case python/IPython is running in a terminal and `large_repr`
equals 'truncate' this can be set to 0 and pandas will auto-detect
the height of the terminal and print a truncated object which fits
the screen height. The IPython notebook, IPython qtconsole, or
IDLE do not run in a terminal and hence it is not possible to do
correct auto-detection.
[default: 60] [currently: 60]
option_context ()
menadżer kontekstu option_context służy do ustawiania opcji w with statementtymczasowo. Wartości opcji są przywracane automatycznie po wyjściu zwith block -
display.max_rows
Używając option_context (), możemy tymczasowo ustawić wartość.
import pandas as pd
with pd.option_context("display.max_rows",10):
print(pd.get_option("display.max_rows"))
print(pd.get_option("display.max_rows"))
Jego output wygląda następująco -
10
10
Zobacz różnicę między pierwszą a drugą instrukcją print. Pierwsza instrukcja wyświetla wartość ustawioną przezoption_context() który jest tymczasowy w with contextsamo. Powith context, druga instrukcja print drukuje skonfigurowaną wartość.
Często używane parametry
Sr.No | Parametr i opis |
---|---|
1 | display.max_rows Wyświetla maksymalną liczbę wierszy do wyświetlenia |
2 | 2 display.max_columns Wyświetla maksymalną liczbę kolumn do wyświetlenia |
3 | display.expand_frame_repr Wyświetla ramki danych do rozciągniętych stron |
4 | display.max_colwidth Wyświetla maksymalną szerokość kolumny |
5 | display.precision Wyświetla dokładność liczb dziesiętnych |
W tym rozdziale omówimy, jak wyciąć i pokroić w kostkę datę i ogólnie uzyskać podzbiór obiektu pandy.
Operatory indeksowania Python i NumPy „[]” oraz operator atrybutów „.” zapewniają szybki i łatwy dostęp do struktur danych Pandas w szerokim zakresie przypadków użycia. Ponieważ jednak typ danych, do których można uzyskać dostęp, nie jest z góry znany, bezpośrednie korzystanie ze standardowych operatorów ma pewne ograniczenia dotyczące optymalizacji. W przypadku kodu produkcyjnego zalecamy skorzystanie ze zoptymalizowanych metod dostępu do danych pand, które zostały wyjaśnione w tym rozdziale.
Pandy obsługują teraz trzy typy indeksowania wieloosiowego; trzy typy są wymienione w poniższej tabeli -
Sr.No | Indeksowanie i opis |
---|---|
1 | .loc() Na podstawie etykiety |
2 | .iloc() Oparte na liczbach całkowitych |
3 | .ix() Oparte na etykietach i liczbach całkowitych |
.loc ()
Pandy zapewniają różne metody czystego posiadania label based indexing. Podczas krojenia dołączana jest również granica początkowa. Liczby całkowite są prawidłowymi etykietami, ale odnoszą się do etykiety, a nie do pozycji.
.loc() ma wiele metod dostępu, takich jak -
- Pojedyncza etykieta skalarna
- Lista etykiet
- Obiekt plasterek
- Tablica boolowska
locprzyjmuje dwa pojedyncze operatory / lista / zakres oddzielone znakiem „,”. Pierwsza wskazuje rząd, a druga kolumny.
Przykład 1
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
#select all rows for a specific column
print df.loc[:,'A']
Jego output wygląda następująco -
a 0.391548
b -0.070649
c -0.317212
d -2.162406
e 2.202797
f 0.613709
g 1.050559
h 1.122680
Name: A, dtype: float64
Przykład 2
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# Select all rows for multiple columns, say list[]
print df.loc[:,['A','C']]
Jego output wygląda następująco -
A C
a 0.391548 0.745623
b -0.070649 1.620406
c -0.317212 1.448365
d -2.162406 -0.873557
e 2.202797 0.528067
f 0.613709 0.286414
g 1.050559 0.216526
h 1.122680 -1.621420
Przykład 3
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# Select few rows for multiple columns, say list[]
print df.loc[['a','b','f','h'],['A','C']]
Jego output wygląda następująco -
A C
a 0.391548 0.745623
b -0.070649 1.620406
f 0.613709 0.286414
h 1.122680 -1.621420
Przykład 4
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# Select range of rows for all columns
print df.loc['a':'h']
Jego output wygląda następująco -
A B C D
a 0.391548 -0.224297 0.745623 0.054301
b -0.070649 -0.880130 1.620406 1.419743
c -0.317212 -1.929698 1.448365 0.616899
d -2.162406 0.614256 -0.873557 1.093958
e 2.202797 -2.315915 0.528067 0.612482
f 0.613709 -0.157674 0.286414 -0.500517
g 1.050559 -2.272099 0.216526 0.928449
h 1.122680 0.324368 -1.621420 -0.741470
Przykład 5
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D'])
# for getting values with a boolean array
print df.loc['a']>0
Jego output wygląda następująco -
A False
B True
C False
D False
Name: a, dtype: bool
.I loc()
Pandy zapewniają różne metody, aby uzyskać indeksowanie oparte wyłącznie na liczbach całkowitych. Podobnie jak Python i Numpy, są0-based indeksowanie.
Różne metody dostępu są następujące -
- Liczba całkowita
- Lista liczb całkowitych
- Zakres wartości
Przykład 1
# import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# select all rows for a specific column
print df.iloc[:4]
Jego output wygląda następująco -
A B C D
0 0.699435 0.256239 -1.270702 -0.645195
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
3 0.539042 -1.284314 0.826977 -0.026251
Przykład 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Integer slicing
print df.iloc[:4]
print df.iloc[1:5, 2:4]
Jego output wygląda następująco -
A B C D
0 0.699435 0.256239 -1.270702 -0.645195
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
3 0.539042 -1.284314 0.826977 -0.026251
C D
1 -0.813012 0.631615
2 0.025070 0.230806
3 0.826977 -0.026251
4 1.423332 1.130568
Przykład 3
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Slicing through list of values
print df.iloc[[1, 3, 5], [1, 3]]
print df.iloc[1:3, :]
print df.iloc[:,1:3]
Jego output wygląda następująco -
B D
1 0.890791 0.631615
3 -1.284314 -0.026251
5 -0.512888 -0.518930
A B C D
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
B C
0 0.256239 -1.270702
1 0.890791 -0.813012
2 -0.531378 0.025070
3 -1.284314 0.826977
4 -0.460729 1.423332
5 -0.512888 0.581409
6 -1.204853 0.098060
7 -0.947857 0.641358
.ix ()
Oprócz czystych etykiet i liczb całkowitych, Pandas zapewnia hybrydową metodę selekcji i podzbioru obiektu za pomocą operatora .ix ().
Przykład 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Integer slicing
print df.ix[:4]
Jego output wygląda następująco -
A B C D
0 0.699435 0.256239 -1.270702 -0.645195
1 -0.685354 0.890791 -0.813012 0.631615
2 -0.783192 -0.531378 0.025070 0.230806
3 0.539042 -1.284314 0.826977 -0.026251
Przykład 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
# Index slicing
print df.ix[:,'A']
Jego output wygląda następująco -
0 0.699435
1 -0.685354
2 -0.783192
3 0.539042
4 -1.044209
5 -1.415411
6 1.062095
7 0.994204
Name: A, dtype: float64
Stosowanie notacji
Pobieranie wartości z obiektu Pandas z indeksowaniem wieloosiowym wykorzystuje następującą notację -
Obiekt | Indeksatory | Typ zwrotu |
---|---|---|
Seria | s.loc [indeksator] | Wartość skalarna |
Ramka danych | df.loc [row_index, col_index] | Obiekt serii |
Płyta | p.loc [item_index, major_index, minor_index] | p.loc [item_index, major_index, minor_index] |
Note − .iloc() & .ix() stosuje te same opcje indeksowania i wartość zwracaną.
Zobaczmy teraz, jak każdą operację można wykonać na obiekcie DataFrame. Użyjemy podstawowego operatora indeksowania „[]” -
Przykład 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df['A']
Jego output wygląda następująco -
0 -0.478893
1 0.391931
2 0.336825
3 -1.055102
4 -0.165218
5 -0.328641
6 0.567721
7 -0.759399
Name: A, dtype: float64
Note - Możemy przekazać listę wartości do [], aby wybrać te kolumny.
Przykład 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df[['A','B']]
Jego output wygląda następująco -
A B
0 -0.478893 -0.606311
1 0.391931 -0.949025
2 0.336825 0.093717
3 -1.055102 -0.012944
4 -0.165218 1.550310
5 -0.328641 -0.226363
6 0.567721 -0.312585
7 -0.759399 -0.372696
Przykład 3
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df[2:2]
Jego output wygląda następująco -
Columns: [A, B, C, D]
Index: []
Dostęp do atrybutów
Kolumny można wybierać za pomocą operatora atrybutu „.”.
Przykład
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print df.A
Jego output wygląda następująco -
0 -0.478893
1 0.391931
2 0.336825
3 -1.055102
4 -0.165218
5 -0.328641
6 0.567721
7 -0.759399
Name: A, dtype: float64
Metody statystyczne pomagają w zrozumieniu i analizie zachowania danych. Nauczymy się teraz kilku funkcji statystycznych, które możemy zastosować na obiektach Pandy.
Percent_change
Serie, ramki danych i panel - wszystkie mają tę funkcję pct_change(). Ta funkcja porównuje każdy element z jego poprzednim elementem i oblicza procentową zmianę.
import pandas as pd
import numpy as np
s = pd.Series([1,2,3,4,5,4])
print s.pct_change()
df = pd.DataFrame(np.random.randn(5, 2))
print df.pct_change()
Jego output wygląda następująco -
0 NaN
1 1.000000
2 0.500000
3 0.333333
4 0.250000
5 -0.200000
dtype: float64
0 1
0 NaN NaN
1 -15.151902 0.174730
2 -0.746374 -1.449088
3 -3.582229 -3.165836
4 15.601150 -1.860434
Domyślnie pct_change()działa na kolumnach; jeśli chcesz zastosować ten sam wiersz mądrze, użyjaxis=1() argument.
Kowariancja
Kowariancja jest stosowana do danych szeregowych. Obiekt Series ma metodę cov obliczającą kowariancję między obiektami serii. NA zostanie automatycznie wykluczona.
Seria Cov
import pandas as pd
import numpy as np
s1 = pd.Series(np.random.randn(10))
s2 = pd.Series(np.random.randn(10))
print s1.cov(s2)
Jego output wygląda następująco -
-0.12978405324
Metoda kowariancji, gdy jest stosowana w DataFrame, oblicza cov między wszystkimi kolumnami.
import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print frame['a'].cov(frame['b'])
print frame.cov()
Jego output wygląda następująco -
-0.58312921152741437
a b c d e
a 1.780628 -0.583129 -0.185575 0.003679 -0.136558
b -0.583129 1.297011 0.136530 -0.523719 0.251064
c -0.185575 0.136530 0.915227 -0.053881 -0.058926
d 0.003679 -0.523719 -0.053881 1.521426 -0.487694
e -0.136558 0.251064 -0.058926 -0.487694 0.960761
Note - Obserwuj cov pomiędzy a i b kolumna w pierwszej instrukcji i to samo jest wartością zwracaną przez cov w DataFrame.
Korelacja
Korelacja przedstawia liniową zależność między dowolnymi dwoma tablicami wartości (szeregami). Istnieje wiele metod obliczania korelacji, takich jak pearson (domyślnie), spearman i kendall.
import pandas as pd
import numpy as np
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print frame['a'].corr(frame['b'])
print frame.corr()
Jego output wygląda następująco -
-0.383712785514
a b c d e
a 1.000000 -0.383713 -0.145368 0.002235 -0.104405
b -0.383713 1.000000 0.125311 -0.372821 0.224908
c -0.145368 0.125311 1.000000 -0.045661 -0.062840
d 0.002235 -0.372821 -0.045661 1.000000 -0.403380
e -0.104405 0.224908 -0.062840 -0.403380 1.000000
Jeśli jakakolwiek nieliczbowa kolumna jest obecna w DataFrame, jest automatycznie wykluczana.
Ranking danych
Ranking danych tworzy ranking dla każdego elementu w tablicy elementów. W przypadku remisów przypisuje średnią rangę.
import pandas as pd
import numpy as np
s = pd.Series(np.random.np.random.randn(5), index=list('abcde'))
s['d'] = s['b'] # so there's a tie
print s.rank()
Jego output wygląda następująco -
a 1.0
b 3.5
c 2.0
d 3.5
e 5.0
dtype: float64
Ranga opcjonalnie przyjmuje parametr rosnący, który domyślnie ma wartość true; jeśli fałsz, dane są klasyfikowane w kolejności odwrotnej, a większe wartości mają niższą rangę.
Rank obsługuje różne metody rozstrzygające, określone za pomocą parametru metody -
average - średnia ranga zremisowanej grupy
min - najniższa pozycja w grupie
max - najwyższa pozycja w grupie
first - rangi przypisane w kolejności, w jakiej pojawiają się w tablicy
Do pracy z danymi liczbowymi, Pandy zapewniają kilka wariantów, takich jak przewijanie, rozwijanie i wykładniczo przesuwające się wagi dla statystyk okien. Wśród nich sąsum, mean, median, variance, covariance, correlation, itp.
Dowiemy się teraz, jak każdy z nich można zastosować do obiektów DataFrame.
.rolling () Funkcja
Tę funkcję można zastosować do serii danych. Określićwindow=n argument i zastosuj na jego wierzchu odpowiednią funkcję statystyczną.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df.rolling(window=3).mean()
Jego output wygląda następująco -
A B C D
2000-01-01 NaN NaN NaN NaN
2000-01-02 NaN NaN NaN NaN
2000-01-03 0.434553 -0.667940 -1.051718 -0.826452
2000-01-04 0.628267 -0.047040 -0.287467 -0.161110
2000-01-05 0.398233 0.003517 0.099126 -0.405565
2000-01-06 0.641798 0.656184 -0.322728 0.428015
2000-01-07 0.188403 0.010913 -0.708645 0.160932
2000-01-08 0.188043 -0.253039 -0.818125 -0.108485
2000-01-09 0.682819 -0.606846 -0.178411 -0.404127
2000-01-10 0.688583 0.127786 0.513832 -1.067156
Note - Ponieważ rozmiar okna wynosi 3, dla pierwszych dwóch elementów są wartości zerowe, a od trzeciego wartość będzie średnią n, n-1 i n-2elementy. W ten sposób możemy również zastosować różne funkcje, jak wspomniano powyżej.
.expanding (), funkcja
Tę funkcję można zastosować do serii danych. Określićmin_periods=n argument i zastosuj na jego wierzchu odpowiednią funkcję statystyczną.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df.expanding(min_periods=3).mean()
Jego output wygląda następująco -
A B C D
2000-01-01 NaN NaN NaN NaN
2000-01-02 NaN NaN NaN NaN
2000-01-03 0.434553 -0.667940 -1.051718 -0.826452
2000-01-04 0.743328 -0.198015 -0.852462 -0.262547
2000-01-05 0.614776 -0.205649 -0.583641 -0.303254
2000-01-06 0.538175 -0.005878 -0.687223 -0.199219
2000-01-07 0.505503 -0.108475 -0.790826 -0.081056
2000-01-08 0.454751 -0.223420 -0.671572 -0.230215
2000-01-09 0.586390 -0.206201 -0.517619 -0.267521
2000-01-10 0.560427 -0.037597 -0.399429 -0.376886
.ewm () Funkcja
ewmjest stosowany do serii danych. Podaj dowolne z com, span,halflifeargument i zastosuj na wierzchu odpowiednią funkcję statystyczną. Przypisuje wagi wykładniczo.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df.ewm(com=0.5).mean()
Jego output wygląda następująco -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 0.865131 -0.453626 -1.137961 0.058747
2000-01-03 -0.132245 -0.807671 -0.308308 -1.491002
2000-01-04 1.084036 0.555444 -0.272119 0.480111
2000-01-05 0.425682 0.025511 0.239162 -0.153290
2000-01-06 0.245094 0.671373 -0.725025 0.163310
2000-01-07 0.288030 -0.259337 -1.183515 0.473191
2000-01-08 0.162317 -0.771884 -0.285564 -0.692001
2000-01-09 1.147156 -0.302900 0.380851 -0.607976
2000-01-10 0.600216 0.885614 0.569808 -1.110113
Funkcje okna są głównie używane do graficznego znajdowania trendów w danych poprzez wygładzanie krzywej. Jeśli codzienne dane są bardzo zróżnicowane i dostępnych jest wiele punktów danych, jedną metodą jest pobranie próbek i wykreślenie, a inną metodą jest zastosowanie obliczeń w oknie i wykreślenie wykresu na wynikach. Tymi metodami możemy wygładzić krzywą lub trend.
Po zwijaniu, rozszerzaniu i ewm obiektów, dostępnych jest kilka metod wykonywania agregacji danych.
Stosowanie agregacji w DataFrame
Stwórzmy DataFrame i zastosujmy na niej agregacje.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r
Jego output wygląda następująco -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 0.790670 -0.387854 -0.668132 0.267283
2000-01-03 -0.575523 -0.965025 0.060427 -2.179780
2000-01-04 1.669653 1.211759 -0.254695 1.429166
2000-01-05 0.100568 -0.236184 0.491646 -0.466081
2000-01-06 0.155172 0.992975 -1.205134 0.320958
2000-01-07 0.309468 -0.724053 -1.412446 0.627919
2000-01-08 0.099489 -1.028040 0.163206 -1.274331
2000-01-09 1.639500 -0.068443 0.714008 -0.565969
2000-01-10 0.326761 1.479841 0.664282 -1.361169
Rolling [window=3,min_periods=1,center=False,axis=0]
Możemy agregować, przekazując funkcję do całej ramki DataFrame lub wybrać kolumnę za pośrednictwem standardu get item metoda.
Zastosuj agregację do całej ramki danych
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r.aggregate(np.sum)
Jego output wygląda następująco -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
Zastosuj agregację do pojedynczej kolumny ramki danych
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r['A'].aggregate(np.sum)
Jego output wygląda następująco -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
2000-01-01 1.088512
2000-01-02 1.879182
2000-01-03 1.303660
2000-01-04 1.884801
2000-01-05 1.194699
2000-01-06 1.925393
2000-01-07 0.565208
2000-01-08 0.564129
2000-01-09 2.048458
2000-01-10 2.065750
Freq: D, Name: A, dtype: float64
Zastosuj agregację w wielu kolumnach ramki danych
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r[['A','B']].aggregate(np.sum)
Jego output wygląda następująco -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
A B
2000-01-01 1.088512 -0.650942
2000-01-02 1.879182 -1.038796
2000-01-03 1.303660 -2.003821
2000-01-04 1.884801 -0.141119
2000-01-05 1.194699 0.010551
2000-01-06 1.925393 1.968551
2000-01-07 0.565208 0.032738
2000-01-08 0.564129 -0.759118
2000-01-09 2.048458 -1.820537
2000-01-10 2.065750 0.383357
Zastosuj wiele funkcji w jednej kolumnie DataFrame
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r['A'].aggregate([np.sum,np.mean])
Jego output wygląda następująco -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
sum mean
2000-01-01 1.088512 1.088512
2000-01-02 1.879182 0.939591
2000-01-03 1.303660 0.434553
2000-01-04 1.884801 0.628267
2000-01-05 1.194699 0.398233
2000-01-06 1.925393 0.641798
2000-01-07 0.565208 0.188403
2000-01-08 0.564129 0.188043
2000-01-09 2.048458 0.682819
2000-01-10 2.065750 0.688583
Zastosuj wiele funkcji w wielu kolumnach ramki danych
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r[['A','B']].aggregate([np.sum,np.mean])
Jego output wygląda następująco -
A B C D
2000-01-01 1.088512 -0.650942 -2.547450 -0.566858
2000-01-02 1.879182 -1.038796 -3.215581 -0.299575
2000-01-03 1.303660 -2.003821 -3.155154 -2.479355
2000-01-04 1.884801 -0.141119 -0.862400 -0.483331
2000-01-05 1.194699 0.010551 0.297378 -1.216695
2000-01-06 1.925393 1.968551 -0.968183 1.284044
2000-01-07 0.565208 0.032738 -2.125934 0.482797
2000-01-08 0.564129 -0.759118 -2.454374 -0.325454
2000-01-09 2.048458 -1.820537 -0.535232 -1.212381
2000-01-10 2.065750 0.383357 1.541496 -3.201469
A B
sum mean sum mean
2000-01-01 1.088512 1.088512 -0.650942 -0.650942
2000-01-02 1.879182 0.939591 -1.038796 -0.519398
2000-01-03 1.303660 0.434553 -2.003821 -0.667940
2000-01-04 1.884801 0.628267 -0.141119 -0.047040
2000-01-05 1.194699 0.398233 0.010551 0.003517
2000-01-06 1.925393 0.641798 1.968551 0.656184
2000-01-07 0.565208 0.188403 0.032738 0.010913
2000-01-08 0.564129 0.188043 -0.759118 -0.253039
2000-01-09 2.048458 0.682819 -1.820537 -0.606846
2000-01-10 2.065750 0.688583 0.383357 0.127786
Zastosuj różne funkcje do różnych kolumn ramki danych
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 4),
index = pd.date_range('1/1/2000', periods=3),
columns = ['A', 'B', 'C', 'D'])
print df
r = df.rolling(window=3,min_periods=1)
print r.aggregate({'A' : np.sum,'B' : np.mean})
Jego output wygląda następująco -
A B C D
2000-01-01 -1.575749 -1.018105 0.317797 0.545081
2000-01-02 -0.164917 -1.361068 0.258240 1.113091
2000-01-03 1.258111 1.037941 -0.047487 0.867371
A B
2000-01-01 -1.575749 -1.018105
2000-01-02 -1.740666 -1.189587
2000-01-03 -0.482555 -0.447078
Brakujące dane są zawsze problemem w rzeczywistych scenariuszach. Obszary takie jak uczenie maszynowe i eksploracja danych borykają się z poważnymi problemami z dokładnością prognoz modelu z powodu niskiej jakości danych spowodowanej brakującymi wartościami. W tych obszarach traktowanie brakujących wartości jest głównym punktem zainteresowania, aby ich modele były dokładniejsze i bardziej aktualne.
Kiedy i dlaczego brakuje danych?
Rozważmy ankietę internetową dotyczącą produktu. Często ludzie nie udostępniają wszystkich związanych z nimi informacji. Niewiele osób dzieli się swoimi doświadczeniami, ale nie dotyczy to tego, jak długo używają produktu; niewiele osób dzieli się tym, jak długo używają produktu, swoimi doświadczeniami, ale nie swoimi danymi kontaktowymi. W ten sposób zawsze brakuje części danych, co jest bardzo powszechne w czasie rzeczywistym.
Zobaczmy teraz, jak możemy obsłużyć brakujące wartości (powiedzmy NA lub NaN) za pomocą Pand.
# import the pandas library
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df
Jego output wygląda następująco -
one two three
a 0.077988 0.476149 0.965836
b NaN NaN NaN
c -0.390208 -0.551605 -2.301950
d NaN NaN NaN
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g NaN NaN NaN
h 0.085100 0.532791 0.887415
Korzystając z reindeksowania, utworzyliśmy DataFrame z brakami danych. Na wyjściuNaN znaczy Not a Number.
Sprawdź brakujące wartości
Aby ułatwić wykrywanie brakujących wartości (i dla różnych typów tablic), Pandas udostępnia rozszerzenie isnull() i notnull() funkcje, które są również metodami w obiektach Series i DataFrame -
Przykład 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].isnull()
Jego output wygląda następująco -
a False
b True
c False
d True
e False
f False
g True
h False
Name: one, dtype: bool
Przykład 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].notnull()
Jego output wygląda następująco -
a True
b False
c True
d False
e True
f True
g False
h True
Name: one, dtype: bool
Obliczenia z brakującymi danymi
- Podczas sumowania danych NA będzie traktowane jako zero
- Jeśli wszystkie dane to NA, wynikiem będzie NA
Przykład 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df['one'].sum()
Jego output wygląda następująco -
2.02357685917
Przykład 2
import pandas as pd
import numpy as np
df = pd.DataFrame(index=[0,1,2,3,4,5],columns=['one','two'])
print df['one'].sum()
Jego output wygląda następująco -
nan
Czyszczenie / uzupełnianie brakujących danych
Pandy zapewniają różne metody czyszczenia brakujących wartości. Funkcja fillna może „wypełnić” wartości NA danymi niezerowymi na kilka sposobów, które zilustrowaliśmy w kolejnych sekcjach.
Zastąp NaN wartością skalarną
Poniższy program pokazuje, jak zamienić „NaN” na „0”.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])
df = df.reindex(['a', 'b', 'c'])
print df
print ("NaN replaced with '0':")
print df.fillna(0)
Jego output wygląda następująco -
one two three
a -0.576991 -0.741695 0.553172
b NaN NaN NaN
c 0.744328 -1.735166 1.749580
NaN replaced with '0':
one two three
a -0.576991 -0.741695 0.553172
b 0.000000 0.000000 0.000000
c 0.744328 -1.735166 1.749580
Tutaj wypełniamy wartością zero; zamiast tego możemy również wypełnić dowolną inną wartością.
Wypełnij NA do przodu i do tyłu
Wykorzystując koncepcje wypełniania omówione w rozdziale o indeksowaniu, uzupełnimy brakujące wartości.
Sr.No | Metoda i działanie |
---|---|
1 | pad/fill Metody wypełnienia Forward |
2 | bfill/backfill Metody wypełniania Wstecz |
Przykład 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.fillna(method='pad')
Jego output wygląda następująco -
one two three
a 0.077988 0.476149 0.965836
b 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
d -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
Przykład 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.fillna(method='backfill')
Jego output wygląda następująco -
one two three
a 0.077988 0.476149 0.965836
b -0.390208 -0.551605 -2.301950
c -0.390208 -0.551605 -2.301950
d -2.000303 -0.788201 1.510072
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
g 0.085100 0.532791 0.887415
h 0.085100 0.532791 0.887415
Usuń brakujące wartości
Jeśli chcesz po prostu wykluczyć brakujące wartości, użyj dropna funkcja wraz z axisargument. Domyślnie oś = 0, tj. Wzdłuż wiersza, co oznacza, że jeśli jakakolwiek wartość w wierszu to NA, cały wiersz jest wykluczony.
Przykład 1
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna()
Jego output wygląda następująco -
one two three
a 0.077988 0.476149 0.965836
c -0.390208 -0.551605 -2.301950
e -2.000303 -0.788201 1.510072
f -0.930230 -0.670473 1.146615
h 0.085100 0.532791 0.887415
Przykład 2
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna(axis=1)
Jego output wygląda następująco -
Empty DataFrame
Columns: [ ]
Index: [a, b, c, d, e, f, g, h]
Zastąp brakujące (lub) wartości ogólne
Często musimy zastąpić wartość ogólną jakąś określoną wartością. Możemy to osiągnąć stosując metodę zamiany.
Zastąpienie NA wartością skalarną jest równoważnym zachowaniem fillna() funkcjonować.
Przykład 1
import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})
Jego output wygląda następująco -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60
Przykład 2
import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000], 'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})
Jego output wygląda następująco -
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60
Każdy groupbyoperacja obejmuje jedną z następujących operacji na oryginalnym obiekcie. Oni są -
Splitting obiekt
Applying funkcja
Combining wyniki
W wielu sytuacjach dzielimy dane na zbiory i stosujemy pewne funkcje w każdym podzbiorze. W zastosowanej funkcjonalności możemy wykonać następujące operacje -
Aggregation - obliczanie statystyki podsumowującej
Transformation - wykonać jakąś operację specyficzną dla grupy
Filtration - odrzucenie danych pod pewnymi warunkami
Stwórzmy teraz obiekt DataFrame i wykonaj na nim wszystkie operacje -
#import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df
Jego output wygląda następująco -
Points Rank Team Year
0 876 1 Riders 2014
1 789 2 Riders 2015
2 863 2 Devils 2014
3 673 3 Devils 2015
4 741 3 Kings 2014
5 812 4 kings 2015
6 756 1 Kings 2016
7 788 1 Kings 2017
8 694 2 Riders 2016
9 701 4 Royals 2014
10 804 1 Royals 2015
11 690 2 Riders 2017
Podziel dane na grupy
Obiekt Pandy można podzielić na dowolne z ich obiektów. Istnieje wiele sposobów podziału obiektu, na przykład -
- obj.groupby('key')
- obj.groupby(['key1','key2'])
- obj.groupby(key,axis=1)
Zobaczmy teraz, jak obiekty grupujące można zastosować do obiektu DataFrame
Przykład
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby('Team')
Jego output wygląda następująco -
<pandas.core.groupby.DataFrameGroupBy object at 0x7fa46a977e50>
Wyświetl grupy
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby('Team').groups
Jego output wygląda następująco -
{'Kings': Int64Index([4, 6, 7], dtype='int64'),
'Devils': Int64Index([2, 3], dtype='int64'),
'Riders': Int64Index([0, 1, 8, 11], dtype='int64'),
'Royals': Int64Index([9, 10], dtype='int64'),
'kings' : Int64Index([5], dtype='int64')}
Przykład
Group by z wieloma kolumnami -
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby(['Team','Year']).groups
Jego output wygląda następująco -
{('Kings', 2014): Int64Index([4], dtype='int64'),
('Royals', 2014): Int64Index([9], dtype='int64'),
('Riders', 2014): Int64Index([0], dtype='int64'),
('Riders', 2015): Int64Index([1], dtype='int64'),
('Kings', 2016): Int64Index([6], dtype='int64'),
('Riders', 2016): Int64Index([8], dtype='int64'),
('Riders', 2017): Int64Index([11], dtype='int64'),
('Devils', 2014): Int64Index([2], dtype='int64'),
('Devils', 2015): Int64Index([3], dtype='int64'),
('kings', 2015): Int64Index([5], dtype='int64'),
('Royals', 2015): Int64Index([10], dtype='int64'),
('Kings', 2017): Int64Index([7], dtype='int64')}
Iterowanie po grupach
Dzięki groupby obiekt w ręku, możemy iterować przez obiekt podobny do itertools.obj.
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Year')
for name,group in grouped:
print name
print group
Jego output wygląda następująco -
2014
Points Rank Team Year
0 876 1 Riders 2014
2 863 2 Devils 2014
4 741 3 Kings 2014
9 701 4 Royals 2014
2015
Points Rank Team Year
1 789 2 Riders 2015
3 673 3 Devils 2015
5 812 4 kings 2015
10 804 1 Royals 2015
2016
Points Rank Team Year
6 756 1 Kings 2016
8 694 2 Riders 2016
2017
Points Rank Team Year
7 788 1 Kings 2017
11 690 2 Riders 2017
Domyślnie groupby obiekt ma taką samą nazwę etykiety jak nazwa grupy.
Wybierz grupę
Używając get_group() możemy wybrać jedną grupę.
# import the pandas library
import pandas as pd
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Year')
print grouped.get_group(2014)
Jego output wygląda następująco -
Points Rank Team Year
0 876 1 Riders 2014
2 863 2 Devils 2014
4 741 3 Kings 2014
9 701 4 Royals 2014
Agregacje
Zagregowana funkcja zwraca jedną zagregowaną wartość dla każdej grupy. Kiedyśgroup by obiektu, na zgrupowanych danych można wykonać kilka operacji agregacji.
Oczywistym jest agregacja za pośrednictwem agregatu lub odpowiednika agg metoda -
# import the pandas library
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Year')
print grouped['Points'].agg(np.mean)
Jego output wygląda następująco -
Year
2014 795.25
2015 769.50
2016 725.00
2017 739.00
Name: Points, dtype: float64
Innym sposobem sprawdzenia rozmiaru każdej grupy jest zastosowanie funkcji size () -
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
Attribute Access in Python Pandas
grouped = df.groupby('Team')
print grouped.agg(np.size)
Jego output wygląda następująco -
Points Rank Year
Team
Devils 2 2 2
Kings 3 3 3
Riders 4 4 4
Royals 2 2 2
kings 1 1 1
Jednoczesne stosowanie wielu funkcji agregujących
W przypadku serii zgrupowanych możesz również zaliczyć list lub dict of functions wykonać agregację i wygenerować DataFrame jako dane wyjściowe -
# import the pandas library
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Team')
print grouped['Points'].agg([np.sum, np.mean, np.std])
Jego output wygląda następująco -
Team sum mean std
Devils 1536 768.000000 134.350288
Kings 2285 761.666667 24.006943
Riders 3049 762.250000 88.567771
Royals 1505 752.500000 72.831998
kings 812 812.000000 NaN
Transformacje
Transformacja grupy lub kolumny zwraca obiekt indeksowany o takim samym rozmiarze, jaki jest grupowany. W związku z tym transformacja powinna zwrócić wynik, który ma taki sam rozmiar, jak rozmiar fragmentu grupy.
# import the pandas library
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
grouped = df.groupby('Team')
score = lambda x: (x - x.mean()) / x.std()*10
print grouped.transform(score)
Jego output wygląda następująco -
Points Rank Year
0 12.843272 -15.000000 -11.618950
1 3.020286 5.000000 -3.872983
2 7.071068 -7.071068 -7.071068
3 -7.071068 7.071068 7.071068
4 -8.608621 11.547005 -10.910895
5 NaN NaN NaN
6 -2.360428 -5.773503 2.182179
7 10.969049 -5.773503 8.728716
8 -7.705963 5.000000 3.872983
9 -7.071068 7.071068 -7.071068
10 7.071068 -7.071068 7.071068
11 -8.157595 5.000000 11.618950
Filtrowanie
Filtracja filtruje dane według zdefiniowanych kryteriów i zwraca podzbiór danych. Plikfilter() funkcja służy do filtrowania danych.
import pandas as pd
import numpy as np
ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}
df = pd.DataFrame(ipl_data)
print df.groupby('Team').filter(lambda x: len(x) >= 3)
Jego output wygląda następująco -
Points Rank Team Year
0 876 1 Riders 2014
1 789 2 Riders 2015
4 741 3 Kings 2014
6 756 1 Kings 2016
7 788 1 Kings 2017
8 694 2 Riders 2016
11 690 2 Riders 2017
W powyższym warunku filtru prosimy o zwrócenie drużyn, które uczestniczyły trzy lub więcej razy w IPL.
Pandas ma w pełni funkcjonalne, wysokowydajne operacje łączenia w pamięci, idiomatycznie bardzo podobne do relacyjnych baz danych, takich jak SQL.
Pandy zapewniają jedną funkcję, merge, jako punkt wejścia dla wszystkich standardowych operacji łączenia bazy danych między obiektami DataFrame -
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)
Tutaj użyliśmy następujących parametrów -
left - Obiekt DataFrame.
right - Kolejny obiekt DataFrame.
on- Kolumny (nazwy) do przyłączenia się. Musi znajdować się zarówno w lewym, jak i prawym obiekcie DataFrame.
left_on- Kolumny z lewej ramki DataFrame do użycia jako klucze. Mogą to być nazwy kolumn lub tablice o długości równej długości DataFrame.
right_on- Kolumny z prawej ramki DataFrame do użycia jako klucze. Mogą to być nazwy kolumn lub tablice o długości równej długości DataFrame.
left_index - Jeśli True,użyj indeksu (etykiet wierszy) z lewej ramki DataFrame jako jego kluczy łączenia. W przypadku ramki DataFrame z MultiIndex (hierarchiczna) liczba poziomów musi odpowiadać liczbie kluczy łączenia z prawej ramki DataFrame.
right_index - To samo użycie co left_index dla właściwej ramki DataFrame.
how- Jedno z „lewej”, „prawej”, „zewnętrznej”, „wewnętrznej”. Domyślnie wewnętrzna. Każda metoda została opisana poniżej.
sort- Sortuj wynik DataFrame według kluczy łączenia w porządku leksykograficznym. Domyślnie True, ustawienie False znacznie poprawi wydajność w wielu przypadkach.
Utwórzmy teraz dwie różne ramki DataFrame i wykonaj na nich operacje scalania.
# import the pandas library
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
{'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print left
print right
Jego output wygląda następująco -
Name id subject_id
0 Alex 1 sub1
1 Amy 2 sub2
2 Allen 3 sub4
3 Alice 4 sub6
4 Ayoung 5 sub5
Name id subject_id
0 Billy 1 sub2
1 Brian 2 sub4
2 Bran 3 sub3
3 Bryce 4 sub6
4 Betty 5 sub5
Scal dwie ramki danych na kluczu
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on='id')
Jego output wygląda następująco -
Name_x id subject_id_x Name_y subject_id_y
0 Alex 1 sub1 Billy sub2
1 Amy 2 sub2 Brian sub4
2 Allen 3 sub4 Bran sub3
3 Alice 4 sub6 Bryce sub6
4 Ayoung 5 sub5 Betty sub5
Scal dwie ramki danych na wielu kluczach
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left,right,on=['id','subject_id'])
Jego output wygląda następująco -
Name_x id subject_id Name_y
0 Alice 4 sub6 Bryce
1 Ayoung 5 sub5 Betty
Scal za pomocą argumentu „jak”
Plik howargument do scalenia określa, jak określić, które klucze mają zostać uwzględnione w tabeli wynikowej. Jeśli kombinacja klawiszy nie pojawia się w lewej ani w prawej tabeli, wartości w połączonej tabeli będą miały wartość NA.
Oto podsumowanie how opcje i ich odpowiedniki w SQL -
Metoda scalania | Odpowiednik SQL | Opis |
---|---|---|
lewo | LEWE POŁĄCZENIE ZEWNĘTRZNE | Użyj klawiszy z lewego obiektu |
dobrze | PRAWE ZEWNĘTRZNE POŁĄCZENIE | Użyj kluczy z odpowiedniego obiektu |
zewnętrzny | PEŁNE POŁĄCZENIE ZEWNĘTRZNE | Użyj unii kluczy |
wewnętrzny | WEWNĘTRZNE DOŁĄCZENIE | Użyj przecięcia kluczy |
Left Join
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='left')
Jego output wygląda następująco -
Name_x id_x subject_id Name_y id_y
0 Alex 1 sub1 NaN NaN
1 Amy 2 sub2 Billy 1.0
2 Allen 3 sub4 Brian 2.0
3 Alice 4 sub6 Bryce 4.0
4 Ayoung 5 sub5 Betty 5.0
Right Join
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='right')
Jego output wygląda następująco -
Name_x id_x subject_id Name_y id_y
0 Amy 2.0 sub2 Billy 1
1 Allen 3.0 sub4 Brian 2
2 Alice 4.0 sub6 Bryce 4
3 Ayoung 5.0 sub5 Betty 5
4 NaN NaN sub3 Bran 3
Połączenie zewnętrzne
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, how='outer', on='subject_id')
Jego output wygląda następująco -
Name_x id_x subject_id Name_y id_y
0 Alex 1.0 sub1 NaN NaN
1 Amy 2.0 sub2 Billy 1.0
2 Allen 3.0 sub4 Brian 2.0
3 Alice 4.0 sub6 Bryce 4.0
4 Ayoung 5.0 sub5 Betty 5.0
5 NaN NaN sub3 Bran 3.0
Połączenie wewnętrzne
Łączenie nastąpi na indeksie. Operacja Join honoruje obiekt, na którym jest wywoływana. Więc,a.join(b) nie jest równe b.join(a).
import pandas as pd
left = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame({
'id':[1,2,3,4,5],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
print pd.merge(left, right, on='subject_id', how='inner')
Jego output wygląda następująco -
Name_x id_x subject_id Name_y id_y
0 Amy 2 sub2 Billy 1
1 Allen 3 sub4 Brian 2
2 Alice 4 sub6 Bryce 4
3 Ayoung 5 sub5 Betty 5
Pandy zapewniają różne udogodnienia do łatwego łączenia Series, DataFrame, i Panel obiekty.
pd.concat(objs,axis=0,join='outer',join_axes=None,
ignore_index=False)
objs - To jest sekwencja lub mapowanie obiektów Series, DataFrame lub Panel.
axis - {0, 1, ...}, domyślnie 0. To jest oś do połączenia.
join- {'wewnętrzny', 'zewnętrzny'}, domyślny 'zewnętrzny'. Jak obsługiwać indeksy na innych osiach. Zewnętrzna do połączenia i wewnętrzna do przecięcia.
ignore_index- boolean, domyślnie False. Jeśli True, nie używaj wartości indeksu na osi konkatenacji. Wynikowa oś zostanie oznaczona jako 0, ..., n - 1.
join_axes- To jest lista obiektów indeksu. Określone indeksy do użycia dla innych (n-1) osi zamiast wykonywania wewnętrznej / zewnętrznej logiki zbioru.
Łączenie obiektów
Plik concatfunkcja wykonuje wszystkie ciężkie czynności związane z wykonywaniem operacji konkatenacji wzdłuż osi. Stwórzmy różne obiekty i zróbmy konkatenację.
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two])
Jego output wygląda następująco -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
Załóżmy, że chcieliśmy skojarzyć określone klucze z każdym fragmentem pociętej ramki DataFrame. Możemy to zrobić za pomocąkeys argument -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two],keys=['x','y'])
Jego output wygląda następująco -
x 1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
y 1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
Indeks wyniku jest zduplikowany; każdy indeks jest powtarzany.
Jeśli wynikowy obiekt ma podlegać własnemu indeksowaniu, ustaw ignore_index do True.
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two],keys=['x','y'],ignore_index=True)
Jego output wygląda następująco -
Marks_scored Name subject_id
0 98 Alex sub1
1 90 Amy sub2
2 87 Allen sub4
3 69 Alice sub6
4 78 Ayoung sub5
5 89 Billy sub2
6 80 Brian sub4
7 79 Bran sub3
8 97 Bryce sub6
9 88 Betty sub5
Obserwuj, indeks zmienia się całkowicie, a klucze również są nadpisywane.
Jeśli trzeba dodać dwa obiekty axis=1, to nowe kolumny zostaną dołączone.
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print pd.concat([one,two],axis=1)
Jego output wygląda następująco -
Marks_scored Name subject_id Marks_scored Name subject_id
1 98 Alex sub1 89 Billy sub2
2 90 Amy sub2 80 Brian sub4
3 87 Allen sub4 79 Bran sub3
4 69 Alice sub6 97 Bryce sub6
5 78 Ayoung sub5 88 Betty sub5
Łączenie przy użyciu append
Przydatnym skrótem do konkatacji są metody dołączania instancji w Series i DataFrame. Te metody faktycznie poprzedziły konkat. Łączą się razemaxis=0czyli indeks -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print one.append(two)
Jego output wygląda następująco -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
Plik append funkcja może również przyjmować wiele obiektów -
import pandas as pd
one = pd.DataFrame({
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5'],
'Marks_scored':[98,90,87,69,78]},
index=[1,2,3,4,5])
two = pd.DataFrame({
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5'],
'Marks_scored':[89,80,79,97,88]},
index=[1,2,3,4,5])
print one.append([two,one,two])
Jego output wygląda następująco -
Marks_scored Name subject_id
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
1 98 Alex sub1
2 90 Amy sub2
3 87 Allen sub4
4 69 Alice sub6
5 78 Ayoung sub5
1 89 Billy sub2
2 80 Brian sub4
3 79 Bran sub3
4 97 Bryce sub6
5 88 Betty sub5
Szereg czasowy
Pandy zapewniają solidne narzędzie do czasu pracy z danymi szeregów czasowych, szczególnie w sektorze finansowym. Podczas pracy z danymi szeregów czasowych często napotykamy:
- Generowanie sekwencji czasu
- Konwertuj szeregi czasowe na różne częstotliwości
Pandy zapewnia stosunkowo kompaktowy i samodzielny zestaw narzędzi do wykonywania powyższych zadań.
Pobierz aktualny czas
datetime.now() podaje aktualną datę i godzinę.
import pandas as pd
print pd.datetime.now()
Jego output wygląda następująco -
2017-05-11 06:10:13.393147
Utwórz znacznik czasu
Dane ze znacznikiem czasu to najbardziej podstawowy typ danych z serii czasowej, który kojarzy wartości z punktami w czasie. W przypadku obiektów pandy oznacza to wykorzystanie punktów w czasie. Weźmy przykład -
import pandas as pd
print pd.Timestamp('2017-03-01')
Jego output wygląda następująco -
2017-03-01 00:00:00
Możliwa jest również konwersja liczb całkowitych lub zmiennoprzecinkowych. Domyślną jednostką dla tego są nanosekundy (ponieważ tak są przechowywane znaczniki czasu). Jednak często epoki są przechowywane w innej jednostce, którą można określić. Weźmy inny przykład
import pandas as pd
print pd.Timestamp(1587687255,unit='s')
Jego output wygląda następująco -
2020-04-24 00:14:15
Utwórz zakres czasu
import pandas as pd
print pd.date_range("11:00", "13:30", freq="30min").time
Jego output wygląda następująco -
[datetime.time(11, 0) datetime.time(11, 30) datetime.time(12, 0)
datetime.time(12, 30) datetime.time(13, 0) datetime.time(13, 30)]
Zmień częstotliwość czasu
import pandas as pd
print pd.date_range("11:00", "13:30", freq="H").time
Jego output wygląda następująco -
[datetime.time(11, 0) datetime.time(12, 0) datetime.time(13, 0)]
Konwertowanie na znaczniki czasu
Aby przekonwertować serię lub obiekt typu lista obiektów typu daty, na przykład ciągów znaków, epok lub ich mieszanki, możesz użyć to_datetimefunkcjonować. Po przekazaniu zwraca Series (z tym samym indeksem), podczas gdy alist-like jest konwertowany na DatetimeIndex. Spójrz na następujący przykład -
import pandas as pd
print pd.to_datetime(pd.Series(['Jul 31, 2009','2010-01-10', None]))
Jego output wygląda następująco -
0 2009-07-31
1 2010-01-10
2 NaT
dtype: datetime64[ns]
NaT znaczy Not a Time (odpowiednik NaN)
Weźmy inny przykład.
import pandas as pd
print pd.to_datetime(['2005/11/23', '2010.12.31', None])
Jego output wygląda następująco -
DatetimeIndex(['2005-11-23', '2010-12-31', 'NaT'], dtype='datetime64[ns]', freq=None)
Rozszerzając szereg czasowy, funkcjonalności Data odgrywają istotną rolę w analizie danych finansowych. Podczas pracy z danymi typu Date często napotykamy:
- Generowanie sekwencji dat
- Konwertuj serie dat na różne częstotliwości
Utwórz zakres dat
Używając date.range()funkcji, określając okresy i częstotliwość, możemy utworzyć serie dat. Domyślna częstotliwość zakresu to dni.
import pandas as pd
print pd.date_range('1/1/2011', periods=5)
Jego output wygląda następująco -
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
dtype='datetime64[ns]', freq='D')
Zmień częstotliwość dat
import pandas as pd
print pd.date_range('1/1/2011', periods=5,freq='M')
Jego output wygląda następująco -
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-30', '2011-05-31'],
dtype='datetime64[ns]', freq='M')
bdate_range
bdate_range () oznacza zakresy dat biznesowych. W przeciwieństwie do date_range () wyklucza sobotę i niedzielę.
import pandas as pd
print pd.date_range('1/1/2011', periods=5)
Jego output wygląda następująco -
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
dtype='datetime64[ns]', freq='D')
Zauważ, że po 3 marca data przeskakuje do 6 marca z wyłączeniem 4 i 5 marca. Po prostu sprawdź dni w kalendarzu.
Wygodne funkcje, takie jak date_range i bdate_rangewykorzystują różne aliasy częstotliwości. Domyślną częstotliwością dla date_range jest dzień kalendarzowy, a domyślną dla bdate_range jest dzień roboczy.
import pandas as pd
start = pd.datetime(2011, 1, 1)
end = pd.datetime(2011, 1, 5)
print pd.date_range(start, end)
Jego output wygląda następująco -
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
dtype='datetime64[ns]', freq='D')
Odsuń aliasy
Kilka aliasów łańcuchów jest przypisanych do użytecznych wspólnych częstotliwości szeregów czasowych. Będziemy nazywać te aliasy jako przesunięte aliasy.
Alias | Opis | Alias | Opis |
---|---|---|---|
b | częstotliwość dni roboczych | BQS | częstotliwość rozpoczęcia kwartału biznesowego |
re | częstotliwość dni kalendarzowych | ZA | roczna (roczna) częstotliwość końcowa |
W. | częstotliwość tygodniowa | BA | częstotliwość zakończenia roku obrotowego |
M | częstotliwość na koniec miesiąca | BAS | częstotliwość rozpoczęcia roku obrotowego |
SM | częstotliwość co pół miesiąca | BH | częstotliwość godzin pracy |
BM | częstotliwość zakończenia miesiąca roboczego | H. | częstotliwość godzinowa |
SM | miesięczna częstotliwość początkowa | T, min | częstotliwość minutowa |
SMS | Częstotliwość wysyłania wiadomości SMS co pół miesiąca | S | druga częstotliwość |
BMS | częstotliwość rozpoczęcia miesiąca roboczego | L, ms | milisekund |
Q | częstotliwość na koniec kwartału | U nas | mikrosekundy |
BQ | częstotliwość na koniec kwartału biznesowego | N | nanosekund |
QS | częstotliwość rozpoczęcia kwartału |
Czasy to różnice w czasie wyrażone w jednostkach różnic, na przykład dni, godziny, minuty, sekundy. Mogą być zarówno pozytywne, jak i negatywne.
Możemy tworzyć obiekty Timedelta przy użyciu różnych argumentów, jak pokazano poniżej -
Strunowy
Przekazując ciąg znaków, możemy stworzyć obiekt timedelta.
import pandas as pd
print pd.Timedelta('2 days 2 hours 15 minutes 30 seconds')
Jego output wygląda następująco -
2 days 02:15:30
Liczba całkowita
Przekazując wartość całkowitą z jednostką, argument tworzy obiekt Timedelta.
import pandas as pd
print pd.Timedelta(6,unit='h')
Jego output wygląda następująco -
0 days 06:00:00
Przesunięcia danych
W budownictwie można również wykorzystać przesunięcia danych, takie jak - tygodnie, dni, godziny, minuty, sekundy, milisekundy, mikrosekundy, nanosekundy.
import pandas as pd
print pd.Timedelta(days=2)
Jego output wygląda następująco -
2 days 00:00:00
to_timedelta ()
Korzystanie z najwyższego poziomu pd.to_timedelta, możesz przekonwertować wartość skalarną, tablicę, listę lub serię z rozpoznawanego formatu / wartości timedelta na typ Timedelta. Konstruuje Serie, jeśli dane wejściowe są Seriami, skalarnymi, jeśli dane wejściowe są podobne do skalarnych, w przeciwnym razie wyprowadzaTimedeltaIndex.
import pandas as pd
print pd.Timedelta(days=2)
Jego output wygląda następująco -
2 days 00:00:00
Operacje
Możesz operować na Series / DataFrames i konstruować timedelta64[ns] Szeregi przez odejmowanie na datetime64[ns] Seria lub sygnatury czasowe.
Utwórzmy teraz ramkę DataFrame z obiektami Timedelta i datetime i wykonaj na niej pewne operacje arytmetyczne -
import pandas as pd
s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
print df
Jego output wygląda następująco -
A B
0 2012-01-01 0 days
1 2012-01-02 1 days
2 2012-01-03 2 days
Operacje dodawania
import pandas as pd
s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']
print df
Jego output wygląda następująco -
A B C
0 2012-01-01 0 days 2012-01-01
1 2012-01-02 1 days 2012-01-03
2 2012-01-03 2 days 2012-01-05
Operacja odejmowania
import pandas as pd
s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']
df['D']=df['C']+df['B']
print df
Jego output wygląda następująco -
A B C D
0 2012-01-01 0 days 2012-01-01 2012-01-01
1 2012-01-02 1 days 2012-01-03 2012-01-04
2 2012-01-03 2 days 2012-01-05 2012-01-07
Często w czasie rzeczywistym dane zawierają powtarzalne kolumny tekstowe. Funkcje takie jak płeć, kraj i kody są zawsze powtarzalne. Oto przykłady danych kategorycznych.
Zmienne kategorialne mogą przyjmować tylko ograniczoną i zwykle stałą liczbę możliwych wartości. Oprócz stałej długości dane kategorialne mogą mieć kolejność, ale nie mogą wykonywać operacji numerycznych. Kategoryczne to typ danych Pandy.
Kategoryczny typ danych jest przydatny w następujących przypadkach:
Zmienna łańcuchowa składająca się tylko z kilku różnych wartości. Konwersja takiej zmiennej łańcuchowej na zmienną kategorialną pozwoli zaoszczędzić trochę pamięci.
Porządek leksykalny zmiennej nie jest taki sam, jak porządek logiczny („jeden”, „dwa”, „trzy”). Konwertując na kategorię i określając kolejność kategorii, sortowanie i min / max użyją kolejności logicznej zamiast porządku leksykalnego.
Jako sygnał dla innych bibliotek Pythona, że ta kolumna powinna być traktowana jako zmienna kategorialna (np. Aby zastosować odpowiednie metody statystyczne lub typy wykresów).
Tworzenie obiektów
Obiekt kategoryczny można utworzyć na wiele sposobów. Poniżej opisano różne sposoby -
Kategoria
Określając dtype jako „kategorię” podczas tworzenia obiektów pandy.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
print s
Jego output wygląda następująco -
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
Liczba elementów przekazanych do obiektu serii to cztery, ale kategorie to tylko trzy. Obserwuj to samo w wyjściowych kategoriach.
pd. kategoryczne
Korzystając ze standardowego konstruktora kategorii pandas, możemy utworzyć obiekt kategorii.
pandas.Categorical(values, categories, ordered)
Weźmy przykład -
import pandas as pd
cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
print cat
Jego output wygląda następująco -
[a, b, c, a, b, c]
Categories (3, object): [a, b, c]
Spójrzmy na inny przykład -
import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
print cat
Jego output wygląda następująco -
[a, b, c, a, b, c, NaN]
Categories (3, object): [c, b, a]
Tutaj drugi argument oznacza kategorie. W ten sposób każda wartość, której nie ma w kategoriach, będzie traktowana jakoNaN.
Teraz spójrz na następujący przykład -
import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
print cat
Jego output wygląda następująco -
[a, b, c, a, b, c, NaN]
Categories (3, object): [c < b < a]
Logicznie rzecz biorąc, zamówienie oznacza, że a jest większy niż b i b jest większy niż c.
Opis
Używając .describe() polecenie na danych kategorycznych, otrzymujemy podobny wynik do pliku Series lub DataFrame z type strunowy.
import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
df = pd.DataFrame({"cat":cat, "s":["a", "c", "c", np.nan]})
print df.describe()
print df["cat"].describe()
Jego output wygląda następująco -
cat s
count 3 3
unique 2 2
top c c
freq 2 2
count 3
unique 2
top c
freq 2
Name: cat, dtype: object
Pobierz właściwości kategorii
obj.cat.categories polecenie służy do pobierania pliku categories of the object.
import pandas as pd
import numpy as np
s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print s.categories
Jego output wygląda następująco -
Index([u'b', u'a', u'c'], dtype='object')
obj.ordered polecenie służy do uzyskania kolejności obiektu.
import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print cat.ordered
Jego output wygląda następująco -
False
Funkcja zwróciła false ponieważ nie określiliśmy żadnego zamówienia.
Zmiana nazw kategorii
Zmiana nazw kategorii odbywa się poprzez przypisanie nowych wartości do series.cat.categoriesseries.cat.categories.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
s.cat.categories = ["Group %s" % g for g in s.cat.categories]
print s.cat.categories
Jego output wygląda następująco -
Index([u'Group a', u'Group b', u'Group c'], dtype='object')
Kategorie początkowe [a,b,c] są aktualizowane przez s.cat.categories własność obiektu.
Dołączanie nowych kategorii
Za pomocą metody Categorical.add.categories () można dołączać nowe kategorie.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
s = s.cat.add_categories([4])
print s.cat.categories
Jego output wygląda następująco -
Index([u'a', u'b', u'c', 4], dtype='object')
Usuwanie kategorii
Używając Categorical.remove_categories() niechciane kategorie mogą zostać usunięte.
import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
print ("Original object:")
print s
print ("After removal:")
print s.cat.remove_categories("a")
Jego output wygląda następująco -
Original object:
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
After removal:
0 NaN
1 b
2 c
3 NaN
dtype: category
Categories (2, object): [b, c]
Porównanie danych kategorialnych
Porównanie danych kategorycznych z innymi obiektami jest możliwe w trzech przypadkach -
porównywanie równości (== i! =) z obiektem podobnym do listy (lista, seria, tablica, ...) o tej samej długości co dane jakościowe.
wszystkie porównania (==,! =,>,> =, <i <=) danych kategorialnych z innymi seriami jakościowymi, gdy uporządkowane == Prawda i kategorie są takie same.
wszystkie porównania danych jakościowych ze skalarem.
Spójrz na następujący przykład -
import pandas as pd
cat = pd.Series([1,2,3]).astype("category", categories=[1,2,3], ordered=True)
cat1 = pd.Series([2,2,2]).astype("category", categories=[1,2,3], ordered=True)
print cat>cat1
Jego output wygląda następująco -
0 False
1 False
2 True
dtype: bool
Podstawowe drukowanie: działka
Ta funkcja w Series i DataFrame to tylko proste opakowanie wokół matplotlib libraries plot() metoda.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10,4),index=pd.date_range('1/1/2000',
periods=10), columns=list('ABCD'))
df.plot()
Jego output wygląda następująco -
Jeśli indeks składa się z dat, wywołuje gct().autofmt_xdate() aby sformatować oś X, jak pokazano na powyższej ilustracji.
Możemy wykreślić jedną kolumnę z inną za pomocą x i y słowa kluczowe.
Metody drukowania pozwalają na użycie kilku stylów wydruku innych niż domyślny wykres liniowy. Te metody można podać jako argument słowa kluczowego kind dlaplot(). Należą do nich -
- bar lub barh dla wykresów słupkowych
- hist dla histogramu
- pudełko na wykres pudełkowy
- „obszar” dla działek powierzchniowych
- „scatter” w przypadku wykresów punktowych
Działka barowa
Zobaczmy teraz, czym jest wykres słupkowy, tworząc go. Wykres słupkowy można utworzyć w następujący sposób -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.bar()
Jego output wygląda następująco -
Aby utworzyć skumulowany wykres słupkowy, pass stacked=True -
import pandas as pd
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.bar(stacked=True)
Jego output wygląda następująco -
Aby uzyskać poziome wykresy słupkowe, użyj barh metoda -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d')
df.plot.barh(stacked=True)
Jego output wygląda następująco -
Histogramy
Histogramy można wykreślić za pomocą plot.hist()metoda. Możemy określić liczbę pojemników.
import pandas as pd
import numpy as np
df = pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
df.plot.hist(bins=20)
Jego output wygląda następująco -
Aby wykreślić różne histogramy dla każdej kolumny, użyj następującego kodu -
import pandas as pd
import numpy as np
df=pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
df.diff.hist(bins=20)
Jego output wygląda następująco -
Wykresy pudełkowe
Boxplot można narysować wywołując Series.box.plot() i DataFrame.box.plot()lub DataFrame.boxplot() wizualizować rozkład wartości w każdej kolumnie.
Na przykład, tutaj jest wykres pudełkowy przedstawiający pięć prób 10 obserwacji jednolitej zmiennej losowej na [0,1).
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
df.plot.box()
Jego output wygląda następująco -
Działka powierzchni
Wykres powierzchni można utworzyć za pomocą Series.plot.area() albo DataFrame.plot.area() metody.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot.area()
Jego output wygląda następująco -
Wykres punktowy
Wykres punktowy można utworzyć za pomocą DataFrame.plot.scatter() metody.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x='a', y='b')
Jego output wygląda następująco -
Wykres kołowy
Wykres kołowy można utworzyć za pomocą DataFrame.plot.pie() metoda.
import pandas as pd
import numpy as np
df = pd.DataFrame(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], columns=['x'])
df.plot.pie(subplots=True)
Jego output wygląda następująco -
Plik Pandas I/O API to zestaw funkcji czytnika najwyższego poziomu, do których można uzyskać dostęp, np pd.read_csv() które zwykle zwracają obiekt Pandas.
Dwie funkcje konia roboczego do czytania plików tekstowych (lub plików płaskich) to read_csv() i read_table(). Obaj używają tego samego kodu analizującego, aby inteligentnie konwertować dane tabelaryczne na plikDataFrame obiekt -
pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',
names=None, index_col=None, usecols=None
pandas.read_csv(filepath_or_buffer, sep='\t', delimiter=None, header='infer',
names=None, index_col=None, usecols=None
Oto jak csv dane pliku wyglądają następująco -
S.No,Name,Age,City,Salary
1,Tom,28,Toronto,20000
2,Lee,32,HongKong,3000
3,Steven,43,Bay Area,8300
4,Ram,38,Hyderabad,3900
Zapisz te dane jako temp.csv i przeprowadzać na nim operacje.
S.No,Name,Age,City,Salary
1,Tom,28,Toronto,20000
2,Lee,32,HongKong,3000
3,Steven,43,Bay Area,8300
4,Ram,38,Hyderabad,3900
Zapisz te dane jako temp.csv i przeprowadzać na nim operacje.
read.csv
read.csv odczytuje dane z plików csv i tworzy obiekt DataFrame.
import pandas as pd
df=pd.read_csv("temp.csv")
print df
Jego output wygląda następująco -
S.No Name Age City Salary
0 1 Tom 28 Toronto 20000
1 2 Lee 32 HongKong 3000
2 3 Steven 43 Bay Area 8300
3 4 Ram 38 Hyderabad 3900
indeks niestandardowy
Określa kolumnę w pliku csv, aby dostosować indeks przy użyciu index_col.
import pandas as pd
df=pd.read_csv("temp.csv",index_col=['S.No'])
print df
Jego output wygląda następująco -
S.No Name Age City Salary
1 Tom 28 Toronto 20000
2 Lee 32 HongKong 3000
3 Steven 43 Bay Area 8300
4 Ram 38 Hyderabad 3900
Konwertery
dtype kolumn można przekazać jako dykt.
import pandas as pd
df = pd.read_csv("temp.csv", dtype={'Salary': np.float64})
print df.dtypes
Jego output wygląda następująco -
S.No int64
Name object
Age int64
City object
Salary float64
dtype: object
Domyślnie dtype w kolumnie Wynagrodzenie to int, ale wynik pokazuje to jako float ponieważ jawnie wyrzuciliśmy typ.
W związku z tym dane wyglądają jak zmiennoprzecinkowe -
S.No Name Age City Salary
0 1 Tom 28 Toronto 20000.0
1 2 Lee 32 HongKong 3000.0
2 3 Steven 43 Bay Area 8300.0
3 4 Ram 38 Hyderabad 3900.0
nazwy_nagłówków
Określ nazwy nagłówka, używając argumentu nazw.
import pandas as pd
df=pd.read_csv("temp.csv", names=['a', 'b', 'c','d','e'])
print df
Jego output wygląda następująco -
a b c d e
0 S.No Name Age City Salary
1 1 Tom 28 Toronto 20000
2 2 Lee 32 HongKong 3000
3 3 Steven 43 Bay Area 8300
4 4 Ram 38 Hyderabad 3900
Zwróć uwagę, że do nazw nagłówków dołączane są nazwy niestandardowe, ale nagłówek w pliku nie został wyeliminowany. Teraz używamy argumentu nagłówka, aby to usunąć.
Jeśli nagłówek znajduje się w wierszu innym niż pierwszy, przekaż numer wiersza do nagłówka. Spowoduje to pominięcie poprzednich wierszy.
import pandas as pd
df=pd.read_csv("temp.csv",names=['a','b','c','d','e'],header=0)
print df
Jego output wygląda następująco -
a b c d e
0 S.No Name Age City Salary
1 1 Tom 28 Toronto 20000
2 2 Lee 32 HongKong 3000
3 3 Steven 43 Bay Area 8300
4 4 Ram 38 Hyderabad 3900
skiprows
skiprows pomija określoną liczbę wierszy.
import pandas as pd
df=pd.read_csv("temp.csv", skiprows=2)
print df
Jego output wygląda następująco -
2 Lee 32 HongKong 3000
0 3 Steven 43 Bay Area 8300
1 4 Ram 38 Hyderabad 3900
Rzadkie obiekty są „kompresowane”, gdy pomijane są jakiekolwiek dane pasujące do określonej wartości (NaN / brakująca wartość, chociaż można wybrać dowolną wartość). Specjalny obiekt SparseIndex śledzi, gdzie dane zostały „rozproszone”. Na przykładzie będzie to o wiele bardziej sensowne. Wszystkie standardowe struktury danych Pandas stosują rozszerzenieto_sparse metoda -
import pandas as pd
import numpy as np
ts = pd.Series(np.random.randn(10))
ts[2:-2] = np.nan
sts = ts.to_sparse()
print sts
Jego output wygląda następująco -
0 -0.810497
1 -1.419954
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 0.439240
9 -1.095910
dtype: float64
BlockIndex
Block locations: array([0, 8], dtype=int32)
Block lengths: array([2, 2], dtype=int32)
Rzadkie obiekty istnieją ze względu na wydajność pamięci.
Załóżmy teraz, że masz dużą ramkę DataFrame NA i wykonaj następujący kod -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10000, 4))
df.ix[:9998] = np.nan
sdf = df.to_sparse()
print sdf.density
Jego output wygląda następująco -
0.0001
Każdy rzadki obiekt można przekształcić z powrotem w standardową gęstą formę przez wywołanie to_dense -
import pandas as pd
import numpy as np
ts = pd.Series(np.random.randn(10))
ts[2:-2] = np.nan
sts = ts.to_sparse()
print sts.to_dense()
Jego output wygląda następująco -
0 -0.810497
1 -1.419954
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 0.439240
9 -1.095910
dtype: float64
Rzadkie Dtypes
Rzadkie dane powinny mieć ten sam typ dty, co ich gęsta reprezentacja. W tej chwili,float64, int64 i booldtypessą obsługiwane. W zależności od oryginałudtype, fill_value default zmiany -
float64 - np.nan
int64 - 0
bool - Fałsz
Wykonajmy następujący kod, aby zrozumieć to samo -
import pandas as pd
import numpy as np
s = pd.Series([1, np.nan, np.nan])
print s
s.to_sparse()
print s
Jego output wygląda następująco -
0 1.0
1 NaN
2 NaN
dtype: float64
0 1.0
1 NaN
2 NaN
dtype: float64
Ostrzeżenia oznaczają ostrzeżenie, a gotcha oznacza niewidoczny problem.
Używanie stwierdzenia If / Truth z Pandami
Pandy przestrzegają konwencji numpy polegającej na zgłaszaniu błędu, gdy próbujesz przekonwertować coś na plik bool. Dzieje się to wif lub when używając operacji logicznych, oraz orlub not. Nie jest jasne, jaki powinien być wynik. Czy powinno być prawdziwe, ponieważ nie ma długości zerowej? Fałsz, ponieważ istnieją wartości Fałsz? Nie jest jasne, więc zamiast tego Pandy podnosiValueError -
import pandas as pd
if pd.Series([False, True, False]):
print 'I am True'
Jego output wygląda następująco -
ValueError: The truth value of a Series is ambiguous.
Use a.empty, a.bool() a.item(),a.any() or a.all().
W ifwarunku, nie jest jasne, co z tym zrobić. Błąd sugeruje, czy użyć plikuNone lub any of those.
import pandas as pd
if pd.Series([False, True, False]).any():
print("I am any")
Jego output wygląda następująco -
I am any
Aby ocenić jednoelementowe obiekty pandy w kontekście logicznym, użyj metody .bool() -
import pandas as pd
print pd.Series([True]).bool()
Jego output wygląda następująco -
True
Bitwise Boolean
Bitowe operatory logiczne, takie jak == i != zwróci szereg boolowski, który i tak jest prawie zawsze wymagany.
import pandas as pd
s = pd.Series(range(5))
print s==4
Jego output wygląda następująco -
0 False
1 False
2 False
3 False
4 True
dtype: bool
operacja isin
Zwraca serię logiczną pokazującą, czy każdy element w serii jest dokładnie zawarty w przekazanej sekwencji wartości.
import pandas as pd
s = pd.Series(list('abc'))
s = s.isin(['a', 'c', 'e'])
print s
Jego output wygląda następująco -
0 True
1 False
2 True
dtype: bool
Reindeksowanie vs ix Gotcha
Wielu użytkowników będzie używać rozszerzenia ix indexing capabilities jako zwięzły sposób wyboru danych z obiektu Pandas -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))
print df
print df.ix[['b', 'c', 'e']]
Jego output wygląda następująco -
one two three four
a -1.582025 1.335773 0.961417 -1.272084
b 1.461512 0.111372 -0.072225 0.553058
c -1.240671 0.762185 1.511936 -0.630920
d -2.380648 -0.029981 0.196489 0.531714
e 1.846746 0.148149 0.275398 -0.244559
f -1.842662 -0.933195 2.303949 0.677641
one two three four
b 1.461512 0.111372 -0.072225 0.553058
c -1.240671 0.762185 1.511936 -0.630920
e 1.846746 0.148149 0.275398 -0.244559
Jest to oczywiście całkowicie równoważne w tym przypadku z użyciem reindex metoda -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))
print df
print df.reindex(['b', 'c', 'e'])
Jego output wygląda następująco -
one two three four
a 1.639081 1.369838 0.261287 -1.662003
b -0.173359 0.242447 -0.494384 0.346882
c -0.106411 0.623568 0.282401 -0.916361
d -1.078791 -0.612607 -0.897289 -1.146893
e 0.465215 1.552873 -1.841959 0.329404
f 0.966022 -0.190077 1.324247 0.678064
one two three four
b -0.173359 0.242447 -0.494384 0.346882
c -0.106411 0.623568 0.282401 -0.916361
e 0.465215 1.552873 -1.841959 0.329404
Niektórzy mogą to stwierdzić ix i reindexsą w 100% równoważne na tej podstawie. Dzieje się tak z wyjątkiem indeksowania liczb całkowitych. Na przykład powyższą operację można alternatywnie wyrazić jako -
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))
print df
print df.ix[[1, 2, 4]]
print df.reindex([1, 2, 4])
Jego output wygląda następująco -
one two three four
a -1.015695 -0.553847 1.106235 -0.784460
b -0.527398 -0.518198 -0.710546 -0.512036
c -0.842803 -1.050374 0.787146 0.205147
d -1.238016 -0.749554 -0.547470 -0.029045
e -0.056788 1.063999 -0.767220 0.212476
f 1.139714 0.036159 0.201912 0.710119
one two three four
b -0.527398 -0.518198 -0.710546 -0.512036
c -0.842803 -1.050374 0.787146 0.205147
e -0.056788 1.063999 -0.767220 0.212476
one two three four
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
4 NaN NaN NaN NaN
Należy o tym pamiętać reindex is strict label indexing only. Może to prowadzić do potencjalnie zaskakujących wyników w przypadkach patologicznych, w których indeks zawiera, powiedzmy, zarówno liczby całkowite, jak i łańcuchy.
Ponieważ wielu potencjalnych użytkowników Pand jest zaznajomionych z SQL, ta strona ma na celu przedstawienie przykładów tego, jak różne operacje SQL mogą być wykonywane przy użyciu pand.
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips.head()
Jego output wygląda następująco -
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
WYBIERZ
W SQL selekcji dokonuje się za pomocą listy kolumn oddzielonych przecinkami, które wybierasz (lub *, aby zaznaczyć wszystkie kolumny) -
SELECT total_bill, tip, smoker, time
FROM tips
LIMIT 5;
W przypadku Pandas wybór kolumn odbywa się poprzez przekazanie listy nazw kolumn do ramki DataFrame -
tips[['total_bill', 'tip', 'smoker', 'time']].head(5)
Sprawdźmy cały program -
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips[['total_bill', 'tip', 'smoker', 'time']].head(5)
Jego output wygląda następująco -
total_bill tip smoker time
0 16.99 1.01 No Dinner
1 10.34 1.66 No Dinner
2 21.01 3.50 No Dinner
3 23.68 3.31 No Dinner
4 24.59 3.61 No Dinner
Wywołanie DataFrame bez listy nazw kolumn spowoduje wyświetlenie wszystkich kolumn (podobnie jak SQL *).
GDZIE
Filtrowanie w języku SQL odbywa się za pomocą klauzuli WHERE.
SELECT * FROM tips WHERE time = 'Dinner' LIMIT 5;
Ramki danych można filtrować na wiele sposobów; najbardziej intuicyjny z nich to indeksowanie boolowskie.
tips[tips['time'] == 'Dinner'].head(5)
Sprawdźmy cały program -
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips[tips['time'] == 'Dinner'].head(5)
Jego output wygląda następująco -
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
Powyższa instrukcja przekazuje serię obiektów True / False do DataFrame, zwracając wszystkie wiersze z wartością True.
Grupuj według
Ta operacja pobiera liczbę rekordów w każdej grupie w całym zestawie danych. Na przykład zapytanie pobierające liczbę wskazówek pozostawionych przez płeć -
SELECT sex, count(*)
FROM tips
GROUP BY sex;
Odpowiednik Pand byłby -
tips.groupby('sex').size()
Sprawdźmy cały program -
import pandas as pd
url = 'https://raw.github.com/pandasdev/
pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
print tips.groupby('sex').size()
Jego output wygląda następująco -
sex
Female 87
Male 157
dtype: int64
N rzędów górnych
SQL zwraca top n rows za pomocą LIMIT -
SELECT * FROM tips
LIMIT 5 ;
Odpowiednik Pand byłby -
tips.head(5)
Sprawdźmy pełny przykład -
import pandas as pd
url = 'https://raw.github.com/pandas-dev/pandas/master/pandas/tests/data/tips.csv'
tips=pd.read_csv(url)
tips = tips[['smoker', 'day', 'time']].head(5)
print tips
Jego output wygląda następująco -
smoker day time
0 No Sun Dinner
1 No Sun Dinner
2 No Sun Dinner
3 No Sun Dinner
4 No Sun Dinner
Oto kilka podstawowych operacji, które porównaliśmy, o których dowiedzieliśmy się w poprzednich rozdziałach Biblioteki Pandas.