Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00112 004790 19012611 na godz. na dobę w sumie
Python w analizie danych. Przetwarzanie danych za pomocą pakietów Pandas i NumPy oraz środowiska IPython. Wydanie II - książka
Python w analizie danych. Przetwarzanie danych za pomocą pakietów Pandas i NumPy oraz środowiska IPython. Wydanie II - książka
Autor: Liczba stron: 480
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-4081-7 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> python - programowanie
Porównaj ceny (książka, ebook (-35%), audiobook).

Analiza danych stała się samodzielną dyscypliną wiedzy interesującą specjalistów z wielu branż: analityków biznesowych, statystyków, architektów oprogramowania czy też osoby zajmujące się sztuczną inteligencją. Wydobywanie informacji ze zbiorów danych pozwala na uzyskanie wiedzy niedostępnej w inny sposób. W tym celu dane trzeba odpowiednio przygotować, oczyścić, przetworzyć i oczywiście poddać analizie. Warto również zadbać o ich wizualizację. Do tych wszystkich zadań najlepiej wykorzystać specjalne narzędzia opracowane w języku Python.

Prezentowana książka jest drugim, zaktualizowanym i uzupełnionym, wydaniem klasycznego podręcznika napisanego z myślą o analitykach, którzy dotychczas nie pracowali w Pythonie, oraz o programistach Pythona, którzy nie zajmowali się dotąd analizą danych ani obliczeniami naukowymi. Przedstawiono tu możliwości oferowane przez Pythona 3.6 oraz najnowsze funkcje pakietów Pandas i NumPy, a także środowisk IPython i Jupyter. Przy opisie poszczególnych narzędzi analitycznych wyjaśniono ich działanie i zaprezentowano przykłady ich wykorzystania w sposób efektywny i kreatywny. Ta książka powinna się znaleźć w podręcznej bibliotece każdego analityka danych!

Najważniejsze zagadnienia:

Python: poznaj idealne narzędzie do analizy danych!


Wes McKinney jest świetnie znany jako twórca pakietu Pandas - popularnej otwartej biblioteki Pythona przeznaczonej do analizy danych. Zajmuje się językami Python i C++. Jest związany ze środowiskiem analityków pracujących w Pythonie i z Apache Software Foundation, z którą rozwija wiele ciekawych projektów. Obecnie pracuje w Nowym Jorku jako architekt oprogramowania. McKinney często występuje w roli prelegenta na różnych konferencjach. Uwielbia podróże, interesuje się lingwistyką i językami obcymi.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython, 2nd Edition Tłumaczenie: Konrad Matuk ISBN: 978-83-283-4081-7 © 2018 Helion S.A. Authorized Polish translation of the English edition of Python for Data Analysis, 2nd Edition ISBN 9781491957660 © 2018 William McKinney This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.” All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/pytand.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/pytand Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treści Przedmowa ....................................................................................................................11 1.1. O czym jest ta książka? Jakie rodzaje danych? 1.3. Podstawowe biblioteki Pythona NumPy pandas Matplotlib IPython i Jupyter SciPy Scikit-learn statsmodels 1.4. Instalacja i konfiguracja 1.2. Dlaczego warto korzystać z Pythona w celu przeprowadzenia analizy danych? Python jako spoiwo Rozwiązywanie problemu „dwujęzyczności” Dlaczego nie Python? 1. Wstęp .............................................................................................................................15 15 15 16 16 17 17 17 18 18 19 19 20 21 21 22 22 23 23 24 24 25 25 26 27 27 27 27 Windows Apple (OS X, macOS) GNU, Linux Instalowanie i aktualizowanie pakietów Pythona Python 2 i Python 3 Zintegrowane środowiska programistyczne i edytory tekstowe 1.5. Społeczność i konferencje 1.6. Nawigacja po książce Przykłady kodu Przykładowe dane Konwencje importowania Żargon 3 Poleć książkęKup książkę 2.1. Interpreter Pythona 2.2. Podstawy interpretera IPython Uruchamianie powłoki IPython Uruchamianie notatnika Jupyter Notebook Uzupełnianie poleceń Introspekcja Polecenie run Wykonywanie kodu ze schowka Skróty klawiaturowe działające w terminalu Polecenia magiczne Integracja pakietu matplotlib 2. Podstawy Pythona oraz obsługi narzędzi IPython i Jupyter ...............................................29 30 31 31 32 35 36 37 39 39 40 42 42 43 50 57 Semantyka języka Python Skalarne typy danych Przepływ sterowania 2.3. Podstawy Pythona 3.2. Funkcje 3.1. Struktury danych i sekwencje Krotka Lista Wbudowane funkcje obsługujące sekwencje Słownik Zbiór Lista, słownik i zbiór — składanie 3. Wbudowane struktury danych, funkcje i pliki ...................................................................61 61 61 64 68 70 73 75 77 78 79 79 81 82 82 84 86 89 91 Przestrzenie nazw, zakres i funkcje lokalne Zwracanie wielu wartości Funkcje są obiektami Funkcje anonimowe (lambda) Currying — częściowa aplikacja argumentów Generatory Błędy i obsługa wyjątków 3.3. Pliki i system operacyjny Bajty i kodowanie Unicode w plikach 3.4. Podsumowanie 4.1. NumPy ndarray — wielowymiarowy obiekt tablicowy 4. Podstawy biblioteki NumPy: obsługa tablic i wektorów ....................................................93 95 96 98 100 Tworzenie tablic ndarray Typ danych tablic ndarray Działania matematyczne z tablicami NumPy 4 (cid:95) Spis treści Poleć książkęKup książkę Podstawy indeksowania i przechwytywania części Indeksowanie i wartości logiczne Indeksowanie specjalne Transponowanie tablic i zamiana osi 4.2. Funkcje uniwersalne — szybkie funkcje wykonywane na poszczególnych elementach tablicy 4.3. Programowanie z użyciem tablic Logiczne operacje warunkowe jako operacje tablicowe Metody matematyczne i statystyczne Metody tablic logicznych Sortowanie Wartości unikalne i operacje logiczne 4.4. Tablice i operacje na plikach 4.5. Algebra liniowa 4.6. Generowanie liczb pseudolosowych 4.7. Przykład: błądzenie losowe Jednoczesne symulowanie wielu błądzeń losowych 4.8. Podsumowanie 101 105 108 109 110 113 115 116 117 118 119 120 120 122 124 125 126 5.1. Wprowadzenie do struktur danych biblioteki pandas Obiekt Series Obiekt DataFrame Obiekty index 5.2. Podstawowe funkcjonalności 5. Rozpoczynamy pracę z biblioteką pandas .......................................................................127 127 128 131 137 139 139 141 143 147 148 153 154 157 158 161 163 165 Uaktualnianie indeksu Odrzucanie elementów osi Indeksowanie, wybieranie i filtrowanie Indeksy w postaci liczb całkowitych Działania arytmetyczne i wyrównywanie danych Funkcje apply i map Sortowanie i tworzenie rankingów Indeksy osi ze zduplikowanymi etykietami Współczynnik korelacji i kowariancja Unikalne wartości, ich liczba i przynależność 5.3. Podsumowywanie i generowanie statystyk opisowych 5.4. Podsumowanie 6.1. Odczyt i zapis danych w formacie tekstowym 6. Odczyt i zapis danych, formaty plików ............................................................................167 167 173 174 Wczytywanie części pliku tekstowego Zapis danych w formacie tekstowym Spis treści (cid:95) 5 Poleć książkęKup książkę Praca z plikami danych rozgraniczonych Dane w formacie JSON XML i HTML — web scraping 6.2. Formaty danych binarnych Obsługa formatu HDF5 Wczytywanie plików programu Microsoft Excel 6.3. Obsługa interfejsów sieciowych 6.4. Obsługa baz danych 6.5. Podsumowanie 176 178 179 182 183 185 186 187 188 7.1. Obsługa brakujących danych Filtrowanie brakujących danych Wypełnianie brakujących danych 7.2. Przekształcanie danych Usuwanie duplikatów Przekształcanie danych przy użyciu funkcji lub mapowania Zastępowanie wartości Zmiana nazw indeksów osi Dyskretyzacja i podział na koszyki Wykrywanie i filtrowanie elementów odstających Permutacje i próbkowanie losowe Przetwarzanie wskaźników i zmiennych zastępczych 7. Czyszczenie i przygotowywanie danych ..........................................................................189 189 191 193 195 195 196 197 199 200 202 203 204 207 207 209 212 215 Metody obiektu typu string Wyrażenia regularne Wektoryzacja funkcji łańcuchów w pakiecie pandas 7.3. Operacje przeprowadzane na łańcuchach 7.4. Podsumowanie 8.1. Indeksowanie hierarchiczne Zmiana kolejności i sortowanie poziomów Parametry statystyki opisowej z uwzględnieniem poziomu Indeksowanie z kolumnami ramki danych 8. Przetwarzanie danych — operacje łączenia, wiązania i przekształcania .........................217 217 220 220 221 222 222 227 230 234 Łączenie ramek danych w stylu łączenia elementów baz danych Łączenie przy użyciu indeksu Konkatenacja wzdłuż osi Łączenie częściowo nakładających się danych 8.2. Łączenie zbiorów danych 6 (cid:95) Spis treści Poleć książkęKup książkę 8.3. Zmiana kształtu i operacje osiowe Przekształcenia z indeksowaniem hierarchicznym Przekształcanie z formatu „długiego” na „szeroki” Przekształcanie z formatu „szerokiego” na „długi” 8.4. Podsumowanie 235 236 238 241 243 9.1. Podstawy obsługi interfejsu pakietu matplotlib Obiekty figure i wykresy składowe Kolory, oznaczenia i style linii Punkty, etykiety i legendy Adnotacje i rysunki Zapisywanie wykresów w postaci plików Konfiguracja pakietu matplotlib 9. Wykresy i wizualizacja danych .......................................................................................245 245 246 250 252 255 257 258 259 259 262 266 268 269 272 272 Wykresy liniowe Wykresy słupkowe Histogramy i wykresy gęstości Wykresy punktowe Wykresy panelowe i dane kategoryczne 9.3. Inne narzędzia przeznaczone do wizualizacji danych w Pythonie 9.4. Podsumowanie 9.2. Generowanie wykresów za pomocą pakietów pandas i seaborn 10.1. Mechanika interfejsu groupby Iteracja po grupach Wybieranie kolumny lub podzbioru kolumn Grupowanie przy użyciu słowników i serii Grupowanie przy użyciu funkcji Grupowanie przy użyciu poziomów indeksu 10. Agregacja danych i operacje wykonywane na grupach ....................................................273 274 277 278 279 280 280 281 282 285 286 288 288 Przetwarzanie kolumna po kolumnie i stosowanie wielu funkcji Zwracanie zagregowanych danych bez indeksów wierszy 10.3. Metoda apply — ogólne zastosowanie techniki dziel-zastosuj-połącz 10.2. Agregacja danych Usuwanie kluczy grup Kwantyle i analiza koszykowa Przykład: wypełnianie brakujących wartości przy użyciu wartości charakterystycznych dla grupy Przykład: losowe generowanie próbek i permutacja Przykład: średnie ważone grup i współczynnik korelacji Przykład: regresja liniowa grup 290 292 293 295 Spis treści (cid:95) 7 Poleć książkęKup książkę 10.4. Tabele przestawne i krzyżowe Tabele krzyżowe 10.5. Podsumowanie 295 298 299 11.2. Podstawy szeregów czasowych Generowanie zakresów dat Częstotliwości i przesunięcia daty Przesuwanie daty 11.4. Obsługa strefy czasowej 11.1. Typy danych i narzędzia przeznaczone do obsługi daty i czasu Konwersja pomiędzy obiektami string i datetime Indeksowanie i wybieranie Szeregi czasowe z duplikatami indeksów 11.3. Zakresy dat, częstotliwości i przesunięcia Lokalizacja i konwersja stref czasowych Operacje z udziałem obiektów Timestamp o wyznaczonej strefie czasowej Operacje pomiędzy różnymi strefami czasowymi 11. Szeregi czasowe .............................................................................................................301 302 303 305 306 309 310 310 313 314 317 317 319 320 321 322 323 325 326 328 329 332 333 334 337 338 340 340 Konwersja częstotliwości łańcuchów Kwartalne częstotliwości okresów Konwersja znaczników czasu na okresy (i z powrotem) Tworzenie obiektów PeriodIndex na podstawie tablic Funkcje ważone wykładniczo Binarne funkcje ruchomego okna Funkcje ruchomego okna definiowane przez użytkownika Zmniejszanie częstotliwości Zwiększanie rozdzielczości i interpolacja Zmiana rozdzielczości z okresami 11.7. Funkcje ruchomego okna 11.8. Podsumowanie 11.5. Okresy i przeprowadzanie na nich operacji matematycznych 11.6. Zmiana rozdzielczości i konwersja częstotliwości 12.1. Dane kategoryczne 12. Zaawansowane funkcje biblioteki pandas ......................................................................341 341 341 343 345 347 349 349 353 Kontekst i motywacja Typ Categorical w bibliotece pandas Obliczenia na obiektach typu Categorical Metody obiektu kategorycznego Transformacje grup i „nieobudowane” operacje grupowania Zmiana rozdzielczości czasu przeprowadzana przy użyciu grup 12.2. Zaawansowane operacje grupowania 8 (cid:95) Spis treści Poleć książkęKup książkę 12.3. Techniki łączenia metod w łańcuch Metoda pipe 12.4. Podsumowanie 354 355 356 Przekształcenia danych za pomocą formuł Patsy Patsy i dane kategoryczne 13.1. Łączenie pandas z kodem modelu 13.2. Tworzenie opisów modeli przy użyciu biblioteki Patsy 13. Wprowadzenie do bibliotek modelujących .....................................................................357 357 360 362 363 366 366 369 369 373 13.4. Wprowadzenie do pakietu scikit-learn 13.5. Dalszy rozwój Szacowanie modeli liniowych Szacowanie procesów szeregów czasowych 13.3. Wprowadzenie do biblioteki statsmodels 14.1. Dane USA.gov serwisu Bitly 14.2. Zbiór danych MovieLens 1M 14.3. Imiona nadawane dzieciom w USA w latach 1880 – 2010 Liczenie stref czasowych w czystym Pythonie Liczenie stref czasowych przy użyciu pakietu pandas 14. Przykłady analizy danych................................................................................................375 375 376 378 384 388 389 394 402 406 409 411 413 414 Statystyki datków z podziałem na wykonywany zawód i pracodawcę Podział kwot datków na koszyki Statystyki datków z podziałem na poszczególne stany 14.4. Baza danych USDA Food 14.5. Baza danych 2012 Federal Election Commission Wyznaczenie rozbieżności ocen Analiza trendów imion 14.6. Podsumowanie A.1. Szczegóły budowy obiektu ndarray Hierarchia typów danych NumPy A.2. Zaawansowane operacje tablicowe A. Zaawansowane zagadnienia związane z biblioteką NumPy ............................................415 415 416 417 417 419 420 422 423 424 426 428 Zmiana wymiarów tablic Kolejności charakterystyczne dla języków C i Fortran Łączenie i dzielenie tablic Powtarzanie elementów — funkcje tile i repeat Alternatywy indeksowania specjalnego — metody take i put Rozgłaszanie wzdłuż innych osi Przypisywanie wartości elementom tablicy poprzez rozgłaszanie A.3. Rozgłaszanie Spis treści (cid:95) 9 Poleć książkęKup książkę A.4. Zaawansowane zastosowania funkcji uniwersalnych Metody instancji funkcji uniwersalnych Pisanie nowych funkcji uniwersalnych w Pythonie A.5. Tablice o złożonej strukturze Zagnieżdżone typy danych i pola wielowymiarowe Do czego przydają się tablice o złożonej strukturze? A.6. Jeszcze coś o sortowaniu Sortowanie pośrednie — metody argsort i lexsort Alternatywne algorytmy sortowania Częściowe sortowanie tablic Wyszukiwanie elementów w posortowanej tablicy za pomocą metody numpy.searchsorted A.7. Pisanie szybkich funkcji NumPy za pomocą pakietu Numba Tworzenie obiektów numpy.ufunc za pomocą pakietu Numba A.8. Zaawansowane tablicowe operacje wejścia i wyjścia Pliki mapowane w pamięci HDF5 i inne możliwości zapisu tablic A.9. Jak zachować wysoką wydajność? Dlaczego warto korzystać z sąsiadujących ze sobą obszarów pamięci? 429 429 431 432 433 434 434 435 436 437 438 439 440 441 441 442 442 443 B.1. Korzystanie z historii poleceń Przeszukiwanie i korzystanie z historii poleceń Zmienne wejściowe i wyjściowe B.2. Interakcja z systemem operacyjnym Polecenia powłoki systemowej i aliasy System tworzenia skrótów do katalogów B.3. Narzędzia programistyczne B. Dodatkowe informacje dotyczące systemu IPython ........................................................445 445 445 446 447 447 448 449 449 453 455 457 458 459 460 461 461 462 Interaktywny debuger Pomiar czasu — funkcje time i timeit Podstawowe profilowanie — funkcje prun i run-p Profilowanie funkcji linia po linii Przeładowywanie modułów Wskazówki dotyczące projektowania kodu B.5. Zaawansowane funkcje środowiska IPython Co zrobić, aby własne klasy były przyjazne dla systemu IPython? Profile i konfiguracja B.4. Wskazówki dotyczące produktywnego tworzenia kodu w środowisku IPython Skorowidz .....................................................................................................................465 10 (cid:95) Spis treści Poleć książkęKup książkę ROZDZIAŁ 5. Rozpoczynamy pracę z biblioteką pandas Większość dalszej części tej książki będzie dotyczyła biblioteki pandas. W jej skład wchodzą struktury danych i narzędzia przeznaczone do przetwarzania danych, które ułatwiają i przyśpieszają oczyszcza- nie danych i analizę w Pythonie. Biblioteka pandas jest często używana w połączeniu z innymi narzę- dziami przeznaczonymi do przetwarzania danych numerycznych, takimi jak NumPy i SciPy, bibliote- kami analitycznymi, takimi jak statsmodels i scikit-learn, a także bibliotekami przeznaczonymi do wizualizacji danych, takimi jak matplotlib. Pakiet pandas przypomina pakiet NumPy — jest nastawio- ny na przetwarzanie tablic, oferuje wiele funkcji operujących na tablicach i umożliwia przetwarzanie danych bez pętli for. W bibliotece pandas zastosowano wiele rozwiązań zaczerpniętych z NumPy, ale największą różnicą pomiędzy tymi bibliotekami jest to, że pandas została zaprojektowana z myślą o pracy z danymi w formie tabel lub danymi o charakterze heterogenicznym, a biblioteka NumPy jest zoptymalizowana pod kątem pracy z homogenicznymi tablicami danych liczbowych. Praca nad otwartym projektem pandas rozpoczęła się w 2010 roku. Od tego czasu biblioteka ta rozwi- nęła się na tyle, że jest stosowana do rozwiązywania wielu rzeczywistych problemów. Obecnie utrzymuje ją społeczność ponad 800 programistów. Bardzo często są to osoby, które zdecydowały się na współudział w rozwoju tego projektu po tym, jak korzystały z niego podczas codziennej pracy z danymi. W całej książce importuję bibliotekę pandas przy użyciu następującej konwencji: In [1]: import pandas as pd W związku z tym we wszystkich miejscach kodu, gdzie zobaczysz zapis pd., miej na uwadze, że dany fragment odwołuje się do biblioteki pandas. W związku z tym, że bardzo często będziemy również korzystać z modułów Series i DataFrame, warto załadować je do swojej lokalnej przestrzeni nazw: In [2]: from pandas import Series, DataFrame 5.1. Wprowadzenie do struktur danych biblioteki pandas Aby móc korzystać z biblioteki pandas, musisz poznać jej dwie główne struktury danych: serie i ramki danych. Nie są to rozwiązania uniwersalne, ale struktury te tworzą solidne i proste w zastosowaniu podstawy wspomagające rozwiązywanie większości problemów. 127 Poleć książkęKup książkę Obiekt Series Seria (ang. Series) to jednowymiarowy obiekt przypominający tablicę. Składa się on z sekwencji warto- ści (typy tych wartości są podobne do typów obsługiwanych przez pakiet NumPy) i związanej z dany- mi tablicy etykiet określanej mianem indeksu. Serię najprościej jest utworzyć na podstawie tablicy danych: In [11]: obj = pd.Series([4, 7, -5, 3]) In [12]: obj Out[12]: 0 4 1 7 2 -5 3 3 dtype: int64 W sesji interaktywnej serie są wyświetlane tak, że po lewej stronie znajduje się indeks, a po prawej wartości odpowiadające poszczególnym elementom indeksu. Nie określiliśmy indeksu danych, ale w takiej sytuacji generowany jest domyślny indeks w postaci liczb całkowitych od 0 do N–1, gdzie N jest długością utworzonych danych. W celu wyświetlenia wartości serii skorzystaj z metody values, a w celu wyświetlenia indeksu — z metody index: In [13]: obj.values Out[13]: array([ 4, 7, -5, 3]) In [14]: obj.index # Przypomina dzia(cid:225)anie funkcji range(4). Out[14]: RangeIndex(start=0, stop=4, step=1) Często będziesz chciał utworzyć obiekt typu Series z indeksem identyfikującym każdy element serii za pomocą etykiety: In [15]: obj2 = pd.Series([4, 7, -5, 3], index=[ d , b , a , c ]) In [16]: obj2 Out[16]: d 4 b 7 a -5 c 3 dtype: int64 In [17]: obj2.index Out[17]: Index([ d , b , a , c ], dtype= object ) W celu wybrania pojedynczej wartości lub zbioru wartości możesz — w przeciwieństwie do tablic NumPy — korzystać z etykiet umieszczonych w indeksie: In [18]: obj2[ a ] Out[18]: -5 In [19]: obj2[ d ] = 6 In [20]: obj2[[ c , a , d ]] Out[20]: c 3 a -5 d 6 dtype: int64 128 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę W zaprezentowanym przykładzie [ c , a , d ] stanowi listę indeksów — jak widzisz, indeksy nie muszą być wartościami liczbowymi, mogą być również łańcuchami. Korzystanie z funkcji biblioteki NumPy, wykonywanie operacji takich jak filtrowanie za pomocą tablicy wartości, mnożenie macierzy lub stosowanie standardowych funkcji matematycznych nie roze- rwie powiązania pomiędzy indeksem a wartością: In [21]: obj2[obj2 0] Out[21]: d 6 b 7 c 3 dtype: int64 In [22]: obj2 * 2 Out[22]: d 12 b 14 a -10 c 6 dtype: int64 In [23]: np.exp(obj2) Out[23]: d 403.428793 b 1096.633158 a 0.006738 c 20.085537 dtype: float64 Obiekty typu Series można porównać do uporządkowanych słowników o określonej długości — w przypadku obu struktur mamy do czynienia z przypisaniem wartości indeksu do wartości danych. Obiekty Series można stosować w wielu kontekstach, w których używa się słowników: In [24]: b in obj2 Out[24]: True In [25]: e in obj2 Out[25]: False Jeżeli dysponujesz danymi w formie słownika, to możesz przekształcić go na serię. Wystarczy przeka- zać go do funkcji Series: In [26]: sdata = { Ohio : 35000, Texas : 71000, Oregon : 16000, Utah : 5000} In [27]: obj3 = pd.Series(sdata) In [28]: obj3 Out[28]: Ohio 35000 Oregon 16000 Texas 71000 Utah 5000 dtype: int64 Jeżeli do funkcji Series przekazujesz tylko słownik, to w wygenerowanej serii posortowane klucze słownika będą pełniły funkcję indeksu. To domyślne zachowanie możesz obejść, przekazując klucze słownika w zaplanowanej przez siebie kolejności: In [29]: states = [ California , Ohio , Oregon , Texas ] 5.1. Wprowadzenie do struktur danych biblioteki pandas (cid:95) 129 Poleć książkęKup książkę In [30]: obj4 = pd.Series(sdata, index=states) In [31]: obj4 Out[31]: California NaN Ohio 35000.0 Oregon 16000.0 Texas 71000.0 dtype: float64 W zaprezentowanym przykładzie trzy wartości znajdujące się w słowniku sdata zostały wyświetlone w określonej wcześniej kolejności. Nie znaleziono wartości klucza California , a więc przypisano mu wartość NaN (nie-liczba) — w bibliotece pandas brakujące wartości są oznaczane właśnie w ten sposób. Klucz Utah nie został uwzględniony w liście states, a więc nie umieszczono go w obiekcie wyjściowym. Brakujące wartości (brakujące dane) będę czasem również określał mianem wartości NA. Funkcje biblioteki pandas isnull i notnull mogą być użyte w celu wykrycia brakujących danych: In [32]: pd.isnull(obj4) Out[32]: California True Ohio False Oregon False Texas False dtype: bool In [33]: pd.notnull(obj4) Out[33]: California False Ohio True Oregon True Texas True dtype: bool Obiekty typu Series umożliwiają również korzystanie z tych funkcji jak z ich metod: In [34]: obj4.isnull() Out[34]: California True Ohio False Oregon False Texas False dtype: bool Zagadnienia związane z obsługą brakujących danych opiszę bardziej szczegółowo w rozdziale 7. Przydatną cechą obiektów typu Series jest to, że automatycznie wyrównują one wartości na podstawie indeksu podczas wykonywania operacji arytmetycznych: In [35]: obj3 Out[35]: Ohio 35000 Oregon 16000 Texas 71000 Utah 5000 dtype: int64 In [36]: obj4 Out[36]: 130 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę California NaN Ohio 35000.0 Oregon 16000.0 Texas 71000.0 dtype: float64 In [37]: obj3 + obj4 Out[37]: California NaN Ohio 70000.0 Oregon 32000.0 Texas 142000.0 Utah NaN dtype: float64 Równanie danych zostanie później opisane w sposób bardziej szczegółowy. Jeżeli masz doświadczenie w pracy z bazami danych, to możesz to traktować jak operację join. Obiekty Series i ich indeksy mają atrybut name, który integruje je z innymi kluczowymi elementami biblioteki pandas: In [38]: obj4.name = population In [39]: obj4.index.name = state In [40]: obj4 Out[40]: state California NaN Ohio 35000.0 Oregon 16000.0 Texas 71000.0 Name: population, dtype: float64 Indeks obiektu Series może być modyfikowany w miejscu za pomocą operacji przypisania: In [41]: obj Out[41]: 0 4 1 7 2 -5 3 3 dtype: int64 In [42]: obj.index = [ Bob , Steve , Jeff , Ryan ] In [43]: obj Out[43]: Bob 4 Steve 7 Jeff -5 Ryan 3 dtype: int64 Obiekt DataFrame Obiekt DataFrame (ramka danych) jest prostokątną tabelą danych. Zawiera ona uporządkowany zbiór kolumn, a w każdej kolumnie może znaleźć się wartość innego typu (wartość liczbowa, łańcuch znaków, wartość logiczna itd.). Ramki danych posiadają indeksy wierszy i kolumn. Można je postrze- gać jako słownik obiektów typu Series współdzielących ten sam indeks. Wewnętrznie Python nie 5.1. Wprowadzenie do struktur danych biblioteki pandas (cid:95) 131 Poleć książkęKup książkę przechowuje tego typu danych w formie listy, słownika ani zbioru jednowymiarowych tablic — dane te są przechowywane w formie dwuwymiarowych bloków. Wyjaśnianie wewnętrznej struktury obiektów typu DataFrame wykracza poza zakres tematyczny tej książki. Co prawda obiekt DataFrame ma charakter dwuwymiarowy, ale pomimo tego może być używany do reprezentacji danych o większej liczbie wymiarów — służy do tego indeksowanie hierarchiczne (zagadnienie to opiszę w rozdziale 8.), a także zaawanso- wane funkcje obsługi danych oferowane przez bibliotekę pandas. Obiekty typu DataFrame mogą być tworzone na wiele różnych sposobów, ale najczęściej generuje się je na podstawie słownika list o równej długości lub tablic NumPy: data = { state : [ Ohio , Ohio , Ohio , Nevada , Nevada , Nevada ], year : [2000, 2001, 2002, 2001, 2002, 2003], pop : [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]} frame = pd.DataFrame(data) Otrzymany obiekt DataFrame będzie posiadał automatycznie przypisany indeks (mechanizm ten działa tak samo jak w przypadku obiektu Series), a kolumny będą posortowane: In [45]: frame Out[45]: pop state year 0 1.5 Ohio 2000 1 1.7 Ohio 2001 2 3.6 Ohio 2002 3 2.4 Nevada 2001 4 2.9 Nevada 2002 5 3.2 Nevada 2003 Jeżeli pracujesz w notatniku Jupyter Notebook, to obiekty dataFrame będą wyświetlane w formacie tabeli, która może być poprawnie wyświetlana przez przeglądarkę internetową. Podczas pracy z dużymi ramkami danych warto korzystać z metody head, która wybiera tylko pięć pierwszych wierszy: In [46]: frame.head() Out[46]: pop state year 0 1.5 Ohio 2000 1 1.7 Ohio 2001 2 3.6 Ohio 2002 3 2.4 Nevada 2001 4 2.9 Nevada 2002 Możesz określić kolejność, w jakiej mają być ustawione kolumny obiektu DataFrame: In [47]: pd.DataFrame(data, columns=[ year , state , pop ]) Out[47]: year state pop 0 2000 Ohio 1.5 1 2001 Ohio 1.7 2 2002 Ohio 3.6 3 2001 Nevada 2.4 4 2002 Nevada 2.9 5 2003 Nevada 3.2 Jeżeli podczas tej operacji przekażesz kolumnę, która nie znajduje się w słowniku, to zostanie ona dodana do obiektu DataFrame, ale zostanie wypełniona wartościami NaN: 132 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę In [48]: frame2 = pd.DataFrame(data, columns=[ year , state , pop , debt ], ....: index=[ one , two , three , four , ....: five , six ]) In [49]: frame2 Out[49]: year state pop debt one 2000 Ohio 1.5 NaN two 2001 Ohio 1.7 NaN three 2002 Ohio 3.6 NaN four 2001 Nevada 2.4 NaN five 2002 Nevada 2.9 NaN six 2003 Nevada 3.2 NaN In [50]: frame2.columns Out[50]: Index([ year , state , pop , debt ], dtype= object ) Dostęp do kolumny obiektu DataFrame można uzyskać za pomocą notacji przypominającej notację słownikową lub za pomocą atrybutu (w obu przypadkach zwrócony zostanie obiekt Series): In [51]: frame2[ state ] Out[51]: one Ohio two Ohio three Ohio four Nevada five Nevada six Nevada Name: state, dtype: object In [52]: frame2.year Out[52]: one 2000 two 2001 three 2002 four 2001 five 2002 six 2003 Name: year, dtype: int64 Stosując w środowisku IPython technikę dostępu opartą na atrybucie (np. frame2.year), możesz korzystać z automatycznego uzupełniania nazw kolumn (klawisza Tab), co znacznie ułatwia pracę. Składnia frame2[kolumna] działa z dowolną nazwą kolumny, a składnia frame2.kolumna działa tylko wtedy, gdy nazwa kolumny jest poprawną nazwą zmiennej Pythona. Zauważ, że zwrócony obiekt Series ma ten sam indeks co obiekt DataFrame, a dodatkowo obu obiektom przypisywane są poprawne atrybuty name. Dostęp do wierszy można uzyskać również za pomocą pozycji lub nazwy i specjalnego atrybutu loc (później przedstawię więcej informacji na ten temat): In [53]: frame2.loc[ three ] Out[53]: year 2002 state Ohio pop 3.6 debt NaN Name: three, dtype: object 5.1. Wprowadzenie do struktur danych biblioteki pandas (cid:95) 133 Poleć książkęKup książkę Kolumny mogą być modyfikowane za pomocą operacji przypisywania. Na przykład do pustej ko- lumny debt można przypisać wartość skalarną lub tablicę z wieloma wartościami: In [54]: frame2[ debt ] = 16.5 In [55]: frame2 Out[55]: year state pop debt one 2000 Ohio 1.5 16.5 two 2001 Ohio 1.7 16.5 three 2002 Ohio 3.6 16.5 four 2001 Nevada 2.4 16.5 five 2002 Nevada 2.9 16.5 six 2003 Nevada 3.2 16.5 In [56]: frame2[ debt ] = np.arange(6.) In [57]: frame2 Out[57]: year state pop debt one 2000 Ohio 1.5 0.0 two 2001 Ohio 1.7 1.0 three 2002 Ohio 3.6 2.0 four 2001 Nevada 2.4 3.0 five 2002 Nevada 2.9 4.0 six 2003 Nevada 3.2 5.0 Podczas przypisywania list lub tablic do kolumny długość przypisywanej zmiennej musi być równa długości obiektu DataFrame. W przypadku przypisywania obiektu typu Series etykiety tego obiektu zostaną wyrównane zgodnie z indeksem obiektu DataFrame, a we wszystkie dziury zostaną wstawione wartości NaN: In [58]: val = pd.Series([-1.2, -1.5, -1.7], index=[ two , four , five ]) In [59]: frame2[ debt ] = val In [60]: frame2 Out[60]: year state pop debt one 2000 Ohio 1.5 NaN two 2001 Ohio 1.7 -1.2 three 2002 Ohio 3.6 NaN four 2001 Nevada 2.4 -1.5 five 2002 Nevada 2.9 -1.7 six 2003 Nevada 3.2 NaN Przypisywanie nieistniejącej kolumny spowoduje utworzenie nowej kolumny. Słowo kluczowe del, podobnie jak w przypadku słowników, jest używane do kasowania kolumn. W celu zaprezentowania działania słowa kluczowego del utworzę nową kolumnę wartości logicznych, w której umieszczę wartość True wszędzie tam, gdzie w kolumnie state znajduje się łańcuch Ohio : In [61]: frame2[ eastern ] = frame2.state == Ohio In [62]: frame2 Out[62]: year state pop debt eastern one 2000 Ohio 1.5 NaN True two 2001 Ohio 1.7 -1.2 True three 2002 Ohio 3.6 NaN True 134 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę four 2001 Nevada 2.4 -1.5 False five 2002 Nevada 2.9 -1.7 False six 2003 Nevada 3.2 NaN False Nowe kolumny nie mogą być tworzone za pomocą składni frame2.eastern. Utworzoną przed chwilą kolumnę można usunąć za pomocą metody del: In [63]: del frame2[ eastern ] In [64]: frame2.columns Out[64]: Index([ year , state , pop , debt ], dtype= object ) Kolumna zwrócona w wyniku indeksowania obiektu DataFrame jest widokiem orygi- nalnych danych, a nie ich kopią. W związku z tym wszelkie operacje modyfikujące zwrócony obiekt Series w miejscu będą modyfikowały również obiekt DataFrame. Kolumna może zostać skopiowana w sposób jawny za pomocą metody copy obiektu Series. Inną popularną formą danych jest zagnieżdżony słownik słowników: In [65]: pop = { Nevada : {2001: 2.4, 2002: 2.9}, ....: Ohio : {2000: 1.5, 2001: 1.7, 2002: 3.6}} Jeżeli zagnieżdżony słownik zostanie przekazany do obiektu DataFrame, to biblioteka pandas potraktuje klucze zewnętrznego słownika jako kolumny, a klucze wewnętrznego słownika jako indeksy wierszy: In [66]: frame3 = pd.DataFrame(pop) In [67]: frame3 Out[67]: Nevada Ohio 2000 NaN 1.5 2001 2.4 1.7 2002 2.9 3.6 Obiekt DataFrame może zostać transponowany (poddany operacji zamiany wierszy z kolumnami) za pomocą składni podobnej do tej, która była używana w przypadku transponowania tablic NumPy: In [68]: frame3.T Out[68]: 2000 2001 2002 Nevada NaN 2.4 2.9 Ohio 1.5 1.7 3.6 Klucze w wewnętrznych słownikach są łączone i sortowane w celu utworzenia indeksu, ale operacja ta nie jest przeprowadzana w przypadku jawnego określenia indeksu: In [69]: pd.DataFrame(pop, index=[2001, 2002, 2003]) Out[69]: Nevada Ohio 2001 2.4 1.7 2002 2.9 3.6 2003 NaN NaN W podobny sposób traktowane są słowniki obiektów Series: 5.1. Wprowadzenie do struktur danych biblioteki pandas (cid:95) 135 Poleć książkęKup książkę In [70]: pdata = { Ohio : frame3[ Ohio ][:-1], ....: Nevada : frame3[ Nevada ][:2]} In [71]: pd.DataFrame(pdata) Out[71]: Nevada Ohio 2000 NaN 1.5 2001 2.4 1.7 W tabeli 5.1 znajdziesz listę wszystkich obiektów, które możesz przekazać do konstruktora obiektu DataFrame. Tabela 5.1. Typy danych obsługiwane przez konstruktor ramki danych Typ Dwuwymiarowa tablica ndarray Słownik tablic, list lub krotek Tablica z rekordami o strukturze zgodnej z NumPy Słownik serii Słownik słowników Lista słowników lub serii Lista list lub krotek Inna ramka danych Obiekt NumPy MaskedArray Uwagi Macierz danych; umożliwia przekazanie dodatkowych etykiet wierszy i kolumn. Każda sekwencja staje się kolumną ramki danych; wszystkie sekwencje muszą być tej samej długości. Dane traktowane tak samo jak w przypadku słownika tablic. Każda wartość staje się kolumną; w razie niezdefiniowania indeksu w sposób jawny klucze poszczególnych serii są łączone w unię w celu utworzenia indeksu wierszy ramki danych. Każdy wewnętrzny słownik staje się kolumną; klucze są łączone w unię w celu utworzenia indeksu wierszy (tak samo jak w przypadku słownika serii). Każdy element staje się wierszem ramki danych; unia kluczy słownika lub indeksów serii staje się etykietami kolumn ramki danych. Traktowana tak samo jak dwuwymiarowa tablica ndarray. W razie nieprzekazania indeksów w sposób jawny wczytywane są indeksy ramki danych. Obiekt jest traktowany tak samo jak dwuwymiarowa tablica ndarray, ale maskowane wartości są traktowane jako brakujące dane. Jeżeli elementy index (indeks) i columns (kolumny) mają zdefiniowane atrybuty name (nazwa), to warto- ści przypisane do tych atrybutów zostaną również wyświetlone wraz z zawartością ramki danych: In [72]: frame3.index.name = year ; frame3.columns.name = state In [73]: frame3 Out[73]: state Nevada Ohio year 2000 NaN 1.5 2001 2.4 1.7 2002 2.9 3.6 Atrybut values obiektu DataFrame zwraca dane w postaci dwuwymiarowej tablicy ndarray: In [74]: frame3.values Out[74]: 136 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę array([[ nan, 1.5], [ 2.4, 1.7], [ 2.9, 3.6]]) Jeżeli kolumny ramki danych są danymi różnego typu, to wszystkie dane wszystkich kolumn zostaną umieszczone w tablicy: In [75]: frame2.values Out[75]: array([[2000, Ohio , 1.5, nan], [2001, Ohio , 1.7, -1.2], [2002, Ohio , 3.6, nan], [2001, Nevada , 2.4, -1.5], [2002, Nevada , 2.9, -1.7], [2003, Nevada , 3.2, nan]], dtype=object) Obiekty index Indeksy (obiekty index) są używane do przechowywania etykiet osi lub innych metadanych, takich jak np. nazwy osi. Tablica lub inna sekwencja etykiet może zostać użyta podczas tworzenia serii lub ramki danych w celu jawnego zdefiniowania indeksu: In [76]: obj = pd.Series(range(3), index=[ a , b , c ]) In [77]: index = obj.index In [78]: index Out[78]: Index([ a , b , c ], dtype= object ) In [79]: index[1:] Out[79]: Index([ b , c ], dtype= object ) Indeksy są obiektami niemodyfikowalnymi, a więc użytkownik nie może ich zmieniać: index[1] = d # B(cid:225)(cid:261)d typu (TypeError) Niemodyfikowalność sprawia, że współdzielenie obiektów typu index pomiędzy strukturami danych jest bezpieczniejsze: In [80]: labels = pd.Index(np.arange(3)) In [81]: labels Out[81]: Int64Index([0, 1, 2], dtype= int64 ) In [82]: obj2 = pd.Series([1.5, -2.5, 0], index=labels) In [83]: obj2 Out[83]: 0 1.5 1 -2.5 2 0.0 dtype: float64 In [84]: obj2.index is labels Out[84]: True Większość problemów analitycznych można rozwiązać bez korzystania z indeksów, ale mechanikę działania indeksów należy zrozumieć, ponieważ niektóre operacje generują dane wyjściowe zawierające indeksy. 5.1. Wprowadzenie do struktur danych biblioteki pandas (cid:95) 137 Poleć książkęKup książkę Indeksy zachowują się jak tablice, ale również jak zbiór danych o stałym rozmiarze: In [85]: frame3 Out[85]: state Nevada Ohio year 2000 NaN 1.5 2001 2.4 1.7 2002 2.9 3.6 In [86]: frame3.columns Out[86]: Index([ Nevada , Ohio ], dtype= object , name= state ) In [87]: Ohio in frame3.columns Out[87]: True In [88]: 2003 in frame3.index Out[88]: False W przeciwieństwie do zbiorów Pythona indeksy pandas mogą zawierać zduplikowane etykiety: In [89]: dup_labels = pd.Index([ foo , foo , bar , bar ]) In [90]: dup_labels Out[90]: Index([ foo , foo , bar , bar ], dtype= object ) Przeprowadzenie operacji wyboru ze zdublowanymi etykietami spowoduje wybranie wszystkich wy- stąpień danej etykiety. Każdy indeks obsługuje wiele metod i własności, które mogą przydać się podczas analizy umieszczo- nych w nim danych. W tabeli 5.2 przedstawiono najczęściej używane metody i własności obiektów typu index. Tabela 5.2. Wybrane metody i własności indeksów Metoda append difference insertion union isin delete drop insert is_monotonic is_unique unique Opis Łączy obiekty typu indeks w celu utworzenia nowego indeksu. Zwraca różnicę zbiorów w postaci indeksu. Zwraca efekt operacji wstawiania. Zwraca efekt operacji sumowania. Generuje tablicę wartości logicznych informujących o tym, czy każda z wartości znajduje się w przekazanym ciągu. Tworzy nowy indeks po usunięciu elementu znajdującego się pod indeksem i. Tworzy nowy indeks po usunięciu przekazanych wartości. Tworzy nowy indeks po wstawieniu elementu pod indeksem i. Zwraca True, jeżeli każdy element jest większy od poprzedniego elementu (lub jest mu równy). Zwraca True, jeżeli indeks nie zawiera zduplikowanych wartości. Tworzy tablicę unikalnych wartości indeksu. 138 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę 5.2. Podstawowe funkcjonalności W tym podrozdziale znajdziesz informacje na temat podstawowych mechanizmów obsługi danych umieszczonych w obiektach typu Series i DataFrame. W kolejnych rozdziałach zgłębię zagadnienia związane z analizą danych i ich przekształcaniem za pomocą biblioteki pandas. Książka, którą trzymasz w ręku, nie jest dokładną dokumentacją biblioteki pandas. Pisząc ją, chciałem się skupić na najważniejszych możliwościach oferowanych przez ten pakiet. Rzadziej używane funkcje biblioteki pandas możesz zgłębić samodzielnie podczas pracy z danymi. Uaktualnianie indeksu Jedną z najważniejszych metod obiektów pandas jest metoda reindex (uaktualnianie indeksu). Umożliwia ona utworzenie nowego obiektu z danymi dopasowanymi do nowego indeksu. Przyjrzyj się następującemu przykładowi: In [91]: obj = pd.Series([4.5, 7.2, -5.3, 3.6], index=[ d , b , a , c ]) In [92]: obj Out[92]: d 4.5 b 7.2 a -5.3 c 3.6 dtype: float64 Wywołanie metody reindex na serii powoduje zmianę kolejności danych — przystosowanie jej do nowego indeksu i wprowadzenie brakujących wartości w miejsca nowych indeksów: In [93]: obj2 = obj.reindex([ a , b , c , d , e ]) In [94]: obj2 Out[94]: a -5.3 b 7.2 c 3.6 d 4.5 e NaN dtype: float64 Podczas zmiany indeksów danych o charakterze szeregu (np. szeregów czasowych) konieczne może okazać się przeprowadzenie operacji takich jak interpolacja lub filtrowanie. W celu wykonania takiej operacji należy skorzystać z opcji method i np. metody ffill, która wypełnia wartości do przodu: In [95]: obj3 = pd.Series([ blue , purple , yellow ], index=[0, 2, 4]) In [96]: obj3 Out[96]: 0 blue 2 purple 4 yellow dtype: object In [97]: obj3.reindex(range(6), method= ffill ) Out[97]: 0 blue 1 blue 5.2. Podstawowe funkcjonalności (cid:95) 139 Poleć książkęKup książkę 2 purple 3 purple 4 yellow 5 yellow dtype: object Metoda reindex w przypadku obiektu DataFrame może zmieniać kolejność (wierszy) indeksu, kolumn lub obu tych elementów. W przypadku przekazania tylko sekwencji wykonywana jest jedynie operacja uaktualniania indeksów wierszy: In [98]: frame = pd.DataFrame(np.arange(9).reshape((3, 3)), ....: index=[ a , c , d ], ....: columns=[ Ohio , Texas , California ]) In [99]: frame Out[99]: Ohio Texas California a 0 1 2 c 3 4 5 d 6 7 8 In [100]: frame2 = frame.reindex([ a , b , c , d ]) In [101]: frame2 Out[101]: Ohio Texas California a 0.0 1.0 2.0 b NaN NaN NaN c 3.0 4.0 5.0 d 6.0 7.0 8.0 W celu uaktualnienia indeksu kolumn należy skorzystać ze słowa kluczowego columns: In [102]: states = [ Texas , Utah , California ] In [103]: frame.reindex(columns=states) Out[103]: Texas Utah California a 1 NaN 2 c 4 NaN 5 d 7 NaN 8 W tabeli 5.3 wymieniono więcej argumentów metody reindex. Tabela 5.3. Argumenty uaktualniania indeksu Argument index method fill_value limit tolerance Opis W charakterze indeksu używana jest nowa sekwencja. Może być to egzemplarz obiektu index lub dowolny inny sekwencyjny obiekt Pythona. Indeks zostanie użyty bezpośrednio, bez kopiowania. Metoda interpolacji (wypełniania) — ffill wypełnia w przód, a bfill wypełnia wstecz. Wartość, która wypełnia brakujące wartości przypisywane nowym indeksom. Maksymalny rozmiar przerwy (wyrażony za pomocą liczby elementów) do wypełnienia podczas wypełniania w przód lub w tył. Maksymalny rozmiar przerwy (wyrażony za pomocą odległości bezwzględnej) do wypełnienia w przypadku niedokładnych dopasowań podczas wypełniania w przód lub w tył. 140 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę Tabela 5.3. Argumenty uaktualniania indeksu — ciąg dalszy Argument level copy Opis Dopasowuje prosty indeks na poziomie wieloindeksu; w przeciwnym wypadku wybiera jego podzbiór. W przypadku wartości True zawsze kopiuje dane (dotyczy to również sytuacji, w której nowy indeks jest taki sam jak stary); w przypadku wartości False nie kopiuje danych, gdy indeksy są identyczne. W dalszej części książki przedstawię więcej informacji na temat bardziej zwięzłego uaktualniania indeksów poprzez indeksowanie etykiet metodą loc. Wielu użytkowników Pythona korzysta tylko z tej techniki: In [104]: frame.loc[[ a , b , c , d ], states] Out[104]: Texas Utah California a 1.0 NaN 2.0 b NaN NaN NaN c 4.0 NaN 5.0 d 7.0 NaN 8.0 Odrzucanie elementów osi Odrzucanie jednego elementu lub kilku elementów osi jest proste do przeprowadzenia, jeżeli dyspo- nujesz tablicą indeksu lub listą bez tych elementów. Metoda drop zwraca nowy obiekt, z którego osi usunięto wybrane wartości (może to się przydać podczas czyszczenia danych i wykonywania operacji logicznych): In [105]: obj = pd.Series(np.arange(5.), index=[ a , b , c , d , e ]) In [106]: obj Out[106]: a 0.0 b 1.0 c 2.0 d 3.0 e 4.0 dtype: float64 In [107]: new_obj = obj.drop( c ) In [108]: new_obj Out[108]: a 0.0 b 1.0 d 3.0 e 4.0 dtype: float64 In [109]: obj.drop([ d , c ]) Out[109]: a 0.0 b 1.0 e 4.0 dtype: float64 W przypadku ramki danych wartości indeksu mogą być usuwane z dowolnej osi. Aby zademon- strować tę możliwość, najpierw utwórzmy przykładowy obiekt typu DataFrame: 5.2. Podstawowe funkcjonalności (cid:95) 141 Poleć książkęKup książkę In [110]: data = pd.DataFrame(np.arange(16).reshape((4, 4)), .....: index=[ Ohio , Colorado , Utah , New York ], .....: columns=[ one , two , three , four ]) In [111]: data Out[111]: one two three four Ohio 0 1 2 3 Colorado 4 5 6 7 Utah 8 9 10 11 New York 12 13 14 15 Wywołanie metody drop z sekwencją etykiet spowoduje odrzucenie wartości z wierszy oznaczonych tymi etykietami (z osi 0): In [112]: data.drop([ Colorado , Ohio ]) Out[112]: one two three four Utah 8 9 10 11 New York 12 13 14 15 Wartości znajdujące się w wybranych kolumnach można odrzucać za pomocą argumentu axis=1 lub axis= columns : In [113]: data.drop( two , axis=1) Out[113]: one three four Ohio 0 2 3 Colorado 4 6 7 Utah 8 10 11 New York 12 14 15 In [114]: data.drop([ two , four ], axis= columns ) Out[114]: one three Ohio 0 2 Colorado 4 6 Utah 8 10 New York 12 14 Wiele funkcji modyfikujących rozmiar lub kształt obiektów typu Series lub DataFrame (przykładem takiej funkcji jest drop) może działać w miejscu bez zwracania nowego obiektu. Wystarczy skorzystać z argumentu inplace: In [115]: obj.drop( c , inplace=True) In [116]: obj Out[116]: a 0.0 b 1.0 d 3.0 e 4.0 dtype: float64 Zachowaj ostrożność, korzystając z argumentu inplace, ponieważ jego użycie powoduje nieodwra- calne kasowanie odrzucanych elementów. 142 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę Indeksowanie, wybieranie i filtrowanie Indeksowanie serii (obiekt[…]) działa analogicznie do indeksowania tablic NumPy, ale zamiast z war- tości całkowitoliczbowych musisz korzystać z wartości przypisanych do indeksu serii. Oto ilustrujące to przykłady: In [117]: obj = pd.Series(np.arange(4.), index=[ a , b , c , d ]) In [118]: obj Out[118]: a 0.0 b 1.0 c 2.0 d 3.0 dtype: float64 In [119]: obj[ b ] Out[119]: 1.0 In [120]: obj[1] Out[120]: 1.0 In [121]: obj[2:4] Out[121]: c 2.0 d 3.0 dtype: float64 In [122]: obj[[ b , a , d ]] Out[122]: b 1.0 a 0.0 d 3.0 dtype: float64 In [123]: obj[[1, 3]] Out[123]: b 1.0 d 3.0 dtype: float64 In [124]: obj[obj 2] Out[124]: a 0.0 b 1.0 dtype: float64 Wycinki z etykietami działają nieco inaczej niż w normalnym Pythonie, bo do wycinanego zbioru zaliczany jest również element końcowy: In [125]: obj[ b : c ] Out[125]: b 1.0 c 2.0 dtype: float64 Przypisywanie wartości za pomocą tych metod modyfikuje wybraną sekcję serii: In [126]: obj[ b : c ] = 5 In [127]: obj Out[127]: 5.2. Podstawowe funkcjonalności (cid:95) 143 Poleć książkęKup książkę a 0.0 b 5.0 c 5.0 d 3.0 dtype: float64 Indeks ramki danych umożliwia uzyskanie dostępu do wybranej kolumny lub wybranego ciągu ko- lumn (należy skorzystać z pojedynczej wartości lub z sekwencji): In [128]: data = pd.DataFrame(np.arange(16).reshape((4, 4)), .....: index=[ Ohio , Colorado , Utah , New York ], .....: columns=[ one , two , three , four ]) In [129]: data Out[129]: one two three four Ohio 0 1 2 3 Colorado 4 5 6 7 Utah 8 9 10 11 New York 12 13 14 15 In [130]: data[ two ] Out[130]: Ohio 1 Colorado 5 Utah 9 New York 13 Name: two, dtype: int64 In [131]: data[[ three , one ]] Out[131]: three one Ohio 2 0 Colorado 6 4 Utah 10 8 New York 14 12 Istnieje kilka specjalnych przypadków takiego indeksowania. Pierwszym z nich jest operacja wycinania lub wybierania danych przy użyciu tablicy wartości logicznych: In [132]: data[:2] Out[132]: one two three four Ohio 0 1 2 3 Colorado 4 5 6 7 In [133]: data[data[ three ] 5] Out[133]: one two three four Colorado 4 5 6 7 Utah 8 9 10 11 New York 12 13 14 15 Dla uproszczenia pracy skorzystaliśmy ze składni wybierania danych data[:2]. Przekazanie do opera- tora pojedynczego elementu lub listy [] powoduje wybranie kolumn. Kolejnym ze wspomnianych wcześniej przypadków jest zastosowanie operacji porównywania skalarów: In [134]: data 5 Out[134]: one two three four 144 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę Ohio True True True True Colorado True False False False Utah False False False False New York False False False False In [135]: data[data 5] = 0 In [136]: data Out[136]: one two three four Ohio 0 0 0 0 Colorado 0 5 6 7 Utah 8 9 10 11 New York 12 13 14 15 Jeśli chodzi o składnię, to w tym przypadku ramka danych zachowuje się jak dwuwymiarowa tablica NumPy. Wybieranie za pomocą operatorów loc i iloc Podczas obsługi indeksu w postaci etykiet wierszy ramki danych często przydają się operatory indek- sowania loc i iloc. Pozwalają one na wybranie podzbioru wierszy i kolumn z ramki danych za pomocą notacji podobnej do notacji NymPy przy użyciu etykiet osi (loc) lub wartości całkowitoliczbo- wych (iloc). W pierwszym przykładzie wybieram za pomocą etykiet pierwszy rząd i dwie kolumny: In [137]: data.loc[ Colorado , [ two , three ]] Out[137]: two 5 three 6 Name: Colorado, dtype: int64 Teraz wykonam podobne operacje wyboru za pomocą liczb całkowitych i operatora iloc: In [138]: data.iloc[2, [3, 0, 1]] Out[138]: four 11 one 8 two 9 Name: Utah, dtype: int64 In [139]: data.iloc[2] Out[139]: one 8 two 9 three 10 four 11 Name: Utah, dtype: int64 In [140]: data.iloc[[1, 2], [3, 0, 1]] Out[140]: four one two Colorado 7 0 5 Utah 11 8 9 Obie funkcje indeksowania działają poza pojedynczymi etykietami i listami etykiet również z wycinkami: In [141]: data.loc[: Utah , two ] Out[141]: Ohio 0 5.2. Podstawowe funkcjonalności (cid:95) 145 Poleć książkęKup książkę Colorado 5 Utah 9 Name: two, dtype: int64 In [142]: data.iloc[:, :3][data.three 5] Out[142]: one two three Colorado 0 5 6 Utah 8 9 10 New York 12 13 14 Jak widzisz, istnieje wiele sposobów wybierania i przegrupowywania danych umieszczonych w obiek- tach pakietu pandas. W tabeli 5.4 umieszczono krótkie podsumowanie takich operacji w kontekście ramki danych. W dalszej części tej książki dowiesz się, że istnieje wiele dodatkowych opcji obsługi indeksów hierarchicznych. Tabela 5.4. Opcje indeksowania obiektu DataFrame Typ df[warto(cid:258)(cid:202)] df.loc[warto(cid:258)(cid:202)] df.loc[:, warto(cid:258)(cid:202)] df.loc[warto(cid:258)(cid:202)1, warto(cid:258)(cid:202)2] df.iloc[miejsce] df.iloc[:, miejsce] df.iloc[miejsce_i, miejsce_j] df.at[etykieta_i, etykieta_j] df.iat[i, j] metoda reindex metody get_value i set_value Uwagi Wybiera pojedynczą kolumnę lub sekwencję kolumn z ramki danych; specjalne przypadki użycia: tablica wartości binarnych (filtruje wiersze), wycinek (wycina wiersze), ramka danych z wartościami logicznymi (definiuje wartości na podstawie określonego kryterium). Wybiera pojedynczy wiersz lub podzbiór wierszy z ramki danych na podstawie etykiet. Wybiera pojedynczą kolumnę lub podzbiór kolumn na podstawie etykiet. Wybiera wiersze oraz kolumny na podstawie etykiet. Wybiera pojedynczy wiersz lub podzbiór wierszy z ramki danych na podstawie pozycji określonej za pomocą wartości całkowitoliczbowej. Wybiera pojedynczą kolumnę lub podzbiór kolumn na podstawie pozycji określonej za pomocą wartości całkowitoliczbowej. Wybiera wiersze i kolumny na podstawie pozycji określonej za pomocą wartości całkowitoliczbowej. Wybiera pojedynczą wartość skalarną na podstawie etykiety wiersza i kolumny. Wybiera pojedynczą wartość skalarną z wiersza i kolumny zdefiniowanych za pomocą pozycji (wartości całkowitoliczbowych). Wybiera wiersze lub kolumny na podstawie etykiet. Wybór pojedynczej wartości na podstawie etykiet wiersza i kolumny. 146 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę Na początku procesu projektowania biblioteki pandas uważałem, że wybieranie kolumny za pomocą notacji ramkadanych[:, kolumna] jest zbyt kłopotliwe i naraża kod na potencjalne błędy, ponieważ wybieranie kolumn jest jedną z najczęściej wyko- nywanych operacji. Poszedłem na kompromis i upchnąłem techniki obsługi indeksów (etykiet, a także wartości całkowitoliczbowych) do operatora ix. W praktyce doprowa- dziło to do wielu problematycznych sytuacji z danymi, w których etykiety osi oznaczo- no etykietami w formie liczb całkowitych, dlatego zespół programistów pakietu pandas zdecydował się na utworzenie operatorów loc i iloc, które miały obsługiwać tylko odpowiednie indeksy w formie etykiet (loc) i liczb całkowitych (iloc). Operator indeksowania ix jest wciąż dostępny, ale jego używanie jest niezalecane. Odradzam Ci korzystanie z niego. Indeksy w postaci liczb całkowitych Praca z obiektami pandas oznaczonymi indeksami w postaci liczb całkowitych jest czymś, co sprawia trudność wielu nowym użytkownikom. Wynika to z różnic składni indeksowania pomiędzy strukturami pandas a wbudowanymi strukturami Pythona — listami i krotkami. Prawdopodobnie nie uważasz, że poniższy kod może wygenerować błąd: ser = pd.Series(np.arange(3.)) ser ser[-1] Pakiet pandas może rozpocząć indeksowanie od końca, ale ogólnie rzecz biorąc, w wielu sytuacjach może to doprowadzić do powstania błędów. W zaprezentowanym przykładzie indeks składa się z liczb 0, 1 i 2, ale pandas ma problem z określeniem tego, czego chce użytkownik (biblioteka nie wie, czy zastosowano indeksowanie za pomocą etykiet, czy za pomocą numeru pozycji): In [144]: ser Out[144]: 0 0.0 1 1.0 2 2.0 dtype: float64 W przypadku indeksów niemających formy liczb całkowitych nie ma problemu z dwuznacznością: In [145]: ser2 = pd.Series(np.arange(3.), index=[ a , b , c ]) In [146]: ser2[-1] Out[146]: 2.0 W przypadku etykiet osi zawierających wartości liczbowe wybór danych będzie zawsze oparty na ety- kietach — dla ujednolicenia. W celu zwiększenia precyzji można skorzystać z atrybutu loc (dla etykiet) lub iloc (dla liczb całkowitych): In [147]: ser[:1] Out[147]: 0 0.0 dtype: float64 In [148]: ser.loc[:1] Out[148]: 5.2. Podstawowe funkcjonalności (cid:95) 147 Poleć książkęKup książkę 0 0.0 1 1.0 dtype: float64 In [149]: ser.iloc[:1] Out[149]: 0 0.0 dtype: float64 Działania arytmetyczne i wyrównywanie danych Ważną cechą pakietu pandas z punktu widzenia niektórych zastosowań jest sposób przeprowadze- nia operacji arytmetycznych na obiektach z różnymi indeksami. Jeżeli podczas dodawania któraś z par indeksów nie jest taka sama, to wartości oznaczone takimi indeksami zostaną zaprezentowane w wyniku w postaci unii. Informacja dla osób mających doświadczenie w pracy z bazami danych: działanie to przypomina automatyczne wykonywanie zewnętrznej operacji łączenia (outer join) na etykietach indeksu. Przyjrzyj się następującemu przykładowi: In [150]: s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=[ a , c , d , e ]) In [151]: s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], .....: index=[ a , c , e , f , g ]) In [152]: s1 Out[152]: a 7.3 c -2.5 d 3.4 e 1.5 dtype: float64 In [153]: s2 Out[153]: a -2.1 c 3.6 e -1.5 f 4.0 g 3.1 dtype: float64 Po dodaniu tych obiektów otrzymamy: In [154]: s1 + s2 Out[154]: a 5.2 c 1.1 d NaN e 0.0 f NaN g NaN dtype: float64 Wewnętrzny mechanizm wyrównywania danych wstawia brakujące wartości w miejsca, w których etykiety się nie nakładają. Brakujące wartości przechodzą dalej do kolejnych operacji matematycznych. W przypadku obiektu DataFrame wyrównaniu podlegają wiersze i kolumny: In [155]: df1 = pd.DataFrame(np.arange(9.).reshape((3, 3)), columns=list( bcd ), .....: index=[ Ohio , Texas , Colorado ]) 148 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę In [156]: df2 = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list( bde ), .....: index=[ Utah , Ohio , Texas , Oregon ]) In [157]: df1 Out[157]: b c d Ohio 0.0 1.0 2.0 Texas 3.0 4.0 5.0 Colorado 6.0 7.0 8.0 In [158]: df2 Out[158]: b d e Utah 0.0 1.0 2.0 Ohio 3.0 4.0 5.0 Texas 6.0 7.0 8.0 Oregon 9.0 10.0 11.0 W wyniku dodania do siebie tych dwóch obiektów powstanie ramka danych, której indeksy i kolumny są uniami kolumn i indeksów dodawanych obiektów: In [159]: df1 + df2 Out[159]: b c d e Colorado NaN NaN NaN NaN Ohio 3.0 NaN 6.0 NaN Oregon NaN NaN NaN NaN Texas 9.0 NaN 12.0 NaN Utah NaN NaN NaN NaN Kolumny c i e nie występują w obu dodawanych obiektach DataFrame, a więc w obiekcie wyjściowym są one wypełnione brakującymi wartościami. Takie samo zjawisko występuje również wtedy, gdy jakieś etykiety wierszy nie występują w obu obiektach. Jeżeli dodasz do siebie dwa obiekty DataFrame, w których nie występują żadne wspólne etykiety kolumn i wierszy, to w wyniku znajdą się same wartości null: In [160]: df1 = pd.DataFrame({ A : [1, 2]}) In [161]: df2 = pd.DataFrame({ B : [3, 4]}) In [162]: df1 Out[162]: A 0 1 1 2 In [163]: df2 Out[163]: B 0 3 1 4 In [164]: df1 - df2 Out[164]: A B 0 NaN NaN 1 NaN NaN 5.2. Podstawowe funkcjonalności (cid:95) 149 Poleć książkęKup książkę Metody arytmetyczne i wypełnianie wartościami Podczas wykonywania operacji matematycznych pomiędzy obiektami o różnych indeksach w sytuacji, gdy oś o danej etykiecie znajduje się tylko w jednym obiekcie, możesz wstawić określoną wartość, taką jak np. 0: In [165]: df1 = pd.DataFrame(np.arange(12.).reshape((3, 4)), .....: columns=list( abcd )) In [166]: df2 = pd.DataFrame(np.arange(20.).reshape((4, 5)), .....: columns=list( abcde )) In [167]: df2.loc[1, b ] = np.nan In [168]: df1 Out[168]: a b c d 0 0.0 1.0 2.0 3.0 1 4.0 5.0 6.0 7.0 2 8.0 9.0 10.0 11.0 In [169]: df2 Out[169]: a b c d e 0 0.0 1.0 2.0 3.0 4.0 1 5.0 NaN 7.0 8.0 9.0 2 10.0 11.0 12.0 13.0 14.0 3 15.0 16.0 17.0 18.0 19.0 Dodanie do siebie tych obiektów spowoduje umieszczenie wartości NA w miejscach, w których ety- kiety obu obiektów nie pokrywają się: In [170]: df1 + df2 Out[170]: a b c d e 0 0.0 2.0 4.0 6.0 NaN 1 9.0 NaN 13.0 15.0 NaN 2 18.0 20.0 22.0 24.0 NaN 3 NaN NaN NaN NaN NaN Używając metody add na obiekcie df1, mogę przekazać obiekt df2 oraz argument definiujący wartość używaną do wypełnienia (fill_value): In [171]: df1.add(df2, fill_value=0) Out[171]: a b c d e 0 0.0 2.0 4.0 6.0 4.0 1 9.0 5.0 13.0 15.0 9.0 2 18.0 20.0 22.0 24.0 14.0 3 15.0 16.0 17.0 18.0 19.0 W tabeli 5.5 wymieniono metody operacji arytmetycznych wykonywanych na obiektach Series i Data- Frame. Każda z metod ma swój odpowiednik rozpoczynający się od litery r, który charakteryzuje się odwróconymi argumentami. W związku z tym dwie poniższe metody dają taki sam efekt: In [172]: 1 / df1 Out[172]: a b c d 0 inf 1.000000 0.500000 0.333333 1 0.250000 0.200000 0.166667 0.142857 2 0.125000 0.111111 0.100000 0.090909 150 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę In [173]: df1.rdiv(1) Out[173]: a b c d 0 inf 1.000000 0.500000 0.333333 1 0.250000 0.200000 0.166667 0.142857 2 0.125000 0.111111 0.100000 0.090909 Tabela 5.5. Elastyczne metody arytmetyczne Metoda add, radd sub, rsub div, rdiv floordiv, rfloordiv mul, rmul pow, rpow Opis Metody służące do dodawania (+). Metody służące do odejmowania (–). Metody służące do dzielenia (/). Metody służące do dzielenia całkowitego (//). Metody służące do mnożenia (*). Metody służące do potęgowania (**). Podczas uaktualniania indeksu obiektu typu Series lub DataFrame możesz również określić inną wartość używaną do wypełniania brakujących wartości: In [174]: df1.reindex(columns=df2.columns, fill_value=0) Out[174]: a b c d e 0 0.0 1.0 2.0 3.0 0 1 4.0 5.0 6.0 7.0 0 2 8.0 9.0 10.0 11.0 0 Operacje pomiędzy obiektami DataFrame i Series Operacje arytmetyczne pomiędzy obiektami DataFrame i Series są zdefiniowane podobnie jak w przy- padku tablic NumPy o różnej liczbie wymiarów. Przyjrzyj się poniższemu przykładowi — różnicy pomiędzy dwuwymiarową tablicą i jednym z jej wierszy: In [175]: arr = np.arange(12.).reshape((3, 4)) In [176]: arr Out[176]: array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]]) In [177]: arr[0] Out[177]: array([ 0., 1., 2., 3.]) In [178]: arr - arr[0] Out[178]: array([[ 0., 0., 0., 0.], [ 4., 4., 4., 4.], [ 8., 8., 8., 8.]]) Jak widzisz, podczas odejmowania arr[0] od arr operacja odejmowania jest wykonywana raz dla każdego wiersza. Zjawisko to określa się mianem rozgłaszania. Więcej informacji na jego temat znaj- dziesz w „Dodatku A”. W podobny sposób działają operacje pomiędzy obiektami DataFrame i Series: In [179]: frame = pd.DataFrame(np.arange(12.).reshape((4, 3)), .....: columns=list( bde ), 5.2. Podstawowe funkcjonalności (cid:95) 151 Poleć książkęKup książkę .....: index=[ Utah , Ohio , Texas , Oregon ]) In [180]: series = frame.iloc[0] In [181]: frame Out[181]: b d e Utah 0.0 1.0 2.0 Ohio 3.0 4.0 5.0 Texas 6.0 7.0 8.0 Oregon 9.0 10.0 11.0 In [182]: series Out[182]: b 0.0 d 1.0 e 2.0 Name: Utah, dtype: float6 Domyślnie operacje arytmetyczne pomiędzy obiektami DataFrame i Series dobierają indeks obiektu Series do kolumn obiektu DataFrame i — wykonując operację rozgłaszania — przechodzą w dół wierszy: In [183]: frame - series Out[183]: b d e Utah 0.0 0.0 0.0 Ohio 3.0 3.0 3.0 Texas 6.0 6.0 6.0 Oregon 9.0 9.0 9.0 Jeżeli wartość indeksu nie zostanie znaleziona w kolumnie obiektu DataFrame lub w indeksie obiektu Series, to obiekty zostaną przeindeksowane w celu utworzenia unii: In [184]: series2 = pd.Series(range(3), index=[ b , e , f ]) In [185]: frame + series2 Out[185]: b d e f Utah 0.0 NaN 3.0 NaN Ohio 3.0 NaN 6.0 NaN Texas 6.0 NaN 9.0 NaN Oregon 9.0 NaN 12.0 NaN Jeżeli zamiast tego chcesz przeprowadzić operację rozgłaszania po kolumnach, dopasowując wiersze, musisz skorzystać z jednej z metod arytmetycznych, takich jak: In [186]: series3 = frame[ d ] In [187]: frame Out[187]: b d e Utah 0.0 1.0 2.0 Ohio 3.0 4.0 5.0 Texas 6.0 7.0 8.0 Oregon 9.0 10.0 11.0 In [188]: series3 Out[188]: Utah 1.0 Ohio 4.0 Texas 7.0 152 (cid:95) Rozdział 5. Rozpoczynamy pracę z biblioteką pandas Poleć książkęKup książkę Oregon 10.0 Name: d, dtype: float64 In [189]: frame.sub(series3, axis= index ) Out[189]: b d e Utah -1.0 0.0 1.0 Ohio -1.0 0.0 1.0 Texas -1.0 0.0 1.0 Oregon -1.0 0.0 1.0 Przekazany numer osi określa oś, po któr
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Python w analizie danych. Przetwarzanie danych za pomocą pakietów Pandas i NumPy oraz środowiska IPython. Wydanie II
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: