{"id":29125,"date":"2023-08-09T12:12:23","date_gmt":"2023-08-09T10:12:23","guid":{"rendered":"https:\/\/nearshore-it.eu\/artykuly\/biblioteki-python-pandas\/"},"modified":"2024-09-11T11:18:08","modified_gmt":"2024-09-11T09:18:08","slug":"biblioteki-python-pandas","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/biblioteki-python-pandas\/","title":{"rendered":"Biblioteki Python &#8211; Pandas. Poznaj mo\u017cliwo\u015bci analizy i przetwarzania danych\u00a0"},"content":{"rendered":"\n<p>Pandas to darmowa biblioteka w j\u0119zyku Python, kt\u00f3ra w znaczny spos\u00f3b rozszerza mo\u017cliwo\u015bci analizy i przetwarzania danych. Biblioteka ta jest jednym z najwa\u017cniejszych narz\u0119dzi w \u015brodowisku Python. U\u017cywana jest powszechnie jako wsparcie w r\u00f3\u017cnych obszarach przemys\u0142u. Po przeczytaniu tego artyku\u0142u dowiesz si\u0119<strong>, jak \u0142atwo wczytywa\u0107, przetwarza\u0107 i analizowa\u0107 dane w Pythonie<\/strong>. Ta umiej\u0119tno\u015b\u0107 jest ceniona w wielu dziedzinach, od finans\u00f3w po rozwi\u0105zywanie problem\u00f3w in\u017cynierskich.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"table-of-contents\">\n    <p class=\"title\"><\/p>\n    <ol>\n                    <li><a href=\"#Biblioteki-Python:-Pandas.-Dlaczego-warto-j\u0105-pozna\u0107?-\">1.  Biblioteki Python: Pandas. Dlaczego warto j\u0105 pozna\u0107? <\/a><\/li>\n                    <li><a href=\"#Kiedy-sprawdzi-si\u0119-biblioteka-Pandas?-\">2.  Kiedy sprawdzi si\u0119 biblioteka Pandas? <\/a><\/li>\n                    <li><a href=\"#Przyk\u0142adowe-zastosowania-biblioteki-Pandas\">3.  Przyk\u0142adowe zastosowania biblioteki Pandas.<\/a><\/li>\n                    <li><a href=\"#Jak-zainstalowa\u0107-Pandas?-\">4.  Jak zainstalowa\u0107 Pandas? <\/a><\/li>\n                    <li><a href=\"#Jak-zaimportowa\u0107-Pandas-do-swojego-projektu?-\">5.  Jak zaimportowa\u0107 Pandas do swojego projektu? <\/a><\/li>\n                    <li><a href=\"#Ramki-danych-i-serie-\u2013-Pandas-DataFrame-i-Series-\">6.  Ramki danych i serie \u2013 Pandas DataFrame i Series <\/a><\/li>\n                    <li><a href=\"#Wczytywanie-danych-z-r\u00f3\u017cnych-\u017ar\u00f3de\u0142\">7.  Wczytywanie danych z r\u00f3\u017cnych \u017ar\u00f3de\u0142 <\/a><\/li>\n                    <li><a href=\"#Podstawowe-operacje-na-danych\">8.  Podstawowe operacje na danych <\/a><\/li>\n                    <li><a href=\"#Wybieranie,-filtrowanie-i-sortowanie-danych\">9.  Wybieranie, filtrowanie i sortowanie danych <\/a><\/li>\n                    <li><a href=\"#U\u017cycie-funkcji-apply-i-map\">10.  U\u017cycie funkcji apply i map <\/a><\/li>\n                    <li><a href=\"#Czyszczenie-i-naprawa-brakuj\u0105cych-danych\">11.  Czyszczenie i naprawa brakuj\u0105cych danych<\/a><\/li>\n                    <li><a href=\"#Podstawowe-operacje-statystyczne-i-grupowanie-danych-\">12.  Podstawowe operacje statystyczne i grupowanie danych <\/a><\/li>\n                    <li><a href=\"#Przyk\u0142adowa-analiza-danych-z-u\u017cyciem-Pandas-\">13.  Przyk\u0142adowa analiza danych z u\u017cyciem Pandas <\/a><\/li>\n                    <li><a href=\"#Pandas,-porady-i-najpopularniejsze-funkcje-(cheat-sheet)-\">14.  Pandas, porady i najpopularniejsze funkcje (cheat sheet) <\/a><\/li>\n                    <li><a href=\"#Podsumowanie\">15.  Podsumowanie <\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"Biblioteki-Python:-Pandas.-Dlaczego-warto-j\u0105-pozna\u0107?-\">Biblioteki Python: Pandas. Dlaczego warto j\u0105 pozna\u0107?&nbsp;<\/h2>\n\n\n\n<p>Biblioteka zosta\u0142a stworzona, aby u\u0142atwi\u0107 prac\u0119 z r\u00f3\u017cnego rodzaju danymi, kt\u00f3re nie zawsze s\u0105 kompletne lub wymagaj\u0105 odpowiedniej obr\u00f3bki w celu ich dalszego przetwarzania. Pandas dostarcza elastyczne i \u0142atwe w u\u017cyciu struktury danych i narz\u0119dzia (chocia\u017c nie zawsze wydajne, w dalszej cz\u0119\u015bci zdradz\u0119, w jaki spos\u00f3b sobie z tym poradzi\u0107). Obok takich bibliotek jak <strong>NumPy, Matplotlib, Seaborn czy Scikit-Learn<\/strong> przez wiele lat, biblioteka Pandas zapracowa\u0142a na popularno\u015b\u0107 i uznanie w\u015br\u00f3d kadry akademickiej, analityk\u00f3w, in\u017cynier\u00f3w i pasjonat\u00f3w zainteresowanych prac\u0105 z danymi.&nbsp;<\/p>\n\n\n\n<p><strong>Jest to idealne narz\u0119dzie do zarz\u0105dzania danymi i analizowania ich (z pomoc\u0105 dodatkowych bibliotek) w ma\u0142ych i \u015brednich zbiorach<\/strong>. W przypadku zbior\u00f3w rozleg\u0142ych, popularnych w obszarze zwi\u0105zanym z Big Data, przetwarzanie jest mo\u017cliwe, ale wraz ze wzrostem ilo\u015bci danych, ro\u015bnie prawdopodobie\u0144stwo problem\u00f3w z pami\u0119ci\u0105 i wydajno\u015bci\u0105.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Kiedy-sprawdzi-si\u0119-biblioteka-Pandas?-\">Kiedy sprawdzi si\u0119 biblioteka Pandas?&nbsp;<\/h2>\n\n\n\n<p>Biblioteka Pandas jest dobrze przystosowana do pracy z wykorzystaniem r\u00f3\u017cnych typ\u00f3w i \u017ar\u00f3de\u0142 danych:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tablicowe dane z kolumnami r\u00f3\u017cnego typu (np. <strong>Excel<\/strong>, <strong>SQL<\/strong>)&nbsp;<\/li>\n\n\n\n<li>Szeregi czasowe (<strong>time-series<\/strong>)&nbsp;<\/li>\n\n\n\n<li>Dane z etykietami wierszy i kolumn (<strong>labeled data<\/strong>)&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Przyk\u0142adowe-zastosowania-biblioteki-Pandas\">Przyk\u0142adowe zastosowania biblioteki Pandas<\/h2>\n\n\n\n<p>Oto kilka przyk\u0142ad\u00f3w zastosowa\u0144 biblioteki Pandas:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wczytywanie r\u00f3\u017cnych format\u00f3w danych (<strong>CSV<\/strong>, <strong>Excel<\/strong>, <strong>SQL<\/strong>, <strong>pliki p\u0142askie<\/strong> itd.)&nbsp;<\/li>\n\n\n\n<li><strong>Filtrowanie<\/strong>, <strong>sortowanie <\/strong>i inne operacje z danymi&nbsp;<\/li>\n\n\n\n<li>Czyszczenie danych (<strong>usuwanie warto\u015bci NaN <\/strong>\u2013 <strong>Not a Number<\/strong>), <strong>u\u015brednianie<\/strong>, <strong>zast\u0119powanie warto\u015bci <\/strong>itp.)&nbsp;<\/li>\n\n\n\n<li>Szybkie i efektywne <strong>obliczanie statystyk <\/strong>i przeprowadzanie operacji na danych&nbsp;<\/li>\n\n\n\n<li><strong>Wizualizacja danych<\/strong> za pomoc\u0105 wykres\u00f3w&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Zanim zaczniemy korzysta\u0107 z biblioteki Pandas, upewnijmy si\u0119, \u017ce jest ona zainstalowana w \u015brodowisku Python.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Jak-zainstalowa\u0107-Pandas?-\">Jak zainstalowa\u0107 Pandas?&nbsp;<\/h2>\n\n\n\n<p>Instalacja Pandas jest bardzo prosta i mo\u017ce zosta\u0107 wykonana za pomoc\u0105 narz\u0119dzia pip, kt\u00f3re jest domy\u015blnym mened\u017cerem pakiet\u00f3w Python. Zak\u0142adam, \u017ce Python jest ju\u017c zainstalowany na twoim komputerze, a je\u017celi nie \u2013 tutaj jest <a href=\"https:\/\/wiki.python.org\/moin\/BeginnersGuide\/Download\" target=\"_blank\" rel=\"noreferrer noopener\">instrukcja, jak to zrobi\u0107<\/a>. &nbsp;<\/p>\n\n\n\n<p>Nast\u0119pnie wystarczy otworzy\u0107 terminal i wpisa\u0107 poni\u017csz\u0105 komend\u0119:&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install pandas<\/pre>\n\n\n\n<p>Mo\u017cliwe, \u017ce b\u0119dzie wymagane nadanie uprawnie\u0144 do wykonania tej komendy (np. przy u\u017cyciu <strong>sudo <\/strong>na systemach Unixowych lub uruchamiaj\u0105c terminal z prawami administratora<strong> w systemie Windows<\/strong>), a w przypadku korzystania z konkretnego wirtualnego \u015brodowiska Python (np. <strong>venv<\/strong> lub <strong>conda<\/strong>), konieczne b\u0119dzie aktywowanie tego \u015brodowiska przed zainstalowaniem pakietu. Wi\u0119cej o wirtualnych \u015brodowiskach <a href=\"https:\/\/docs.python.org\/3\/library\/venv.html\" target=\"_blank\" rel=\"noopener\">przeczytasz w dokumentacji<\/a>.<\/p>\n\n\n\n<p>Je\u017celi u\u017cywasz <strong>Anacondy<\/strong>, mo\u017cesz zainstalowa\u0107 Pandas za pomoc\u0105 polecenia:&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">conda install pandas<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Jak-zaimportowa\u0107-Pandas-do-swojego-projektu?-\">Jak zaimportowa\u0107 Pandas do swojego projektu?&nbsp;<\/h2>\n\n\n\n<p>Gdy biblioteka Pandas jest ju\u017c zainstalowana, mo\u017cemy zacz\u0105\u0107 z niej korzysta\u0107. Pierwszym krokiem jest zaimportowanie biblioteki do naszego skryptu lub projektu. Import biblioteki Pandas nie r\u00f3\u017cni si\u0119 niczym od jakiejkolwiek innej biblioteki w Pythonie.&nbsp;<\/p>\n\n\n\n<p>Mo\u017cemy to zrobi\u0107 za pomoc\u0105 poni\u017cszego kodu:&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd<\/pre>\n\n\n\n<p>W Pythonie Pandas zazwyczaj importuje si\u0119 pod aliasem \u2018pd\u2019, kt\u00f3ry jest kr\u00f3tkim i powszechnie przyj\u0119tym skr\u00f3tem. Teraz, kiedy chcemy u\u017cy\u0107 funkcji z biblioteki Pandas, zamiast wpisywa\u0107 pe\u0142ne s\u0142owo \u201epandas\u201d, u\u017cywamy skr\u00f3tu \u201epd\u201d. Analogicznie sytuacja wygl\u0105da w przypadku <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/numpy-wstep-do-biblioteki-python\/\" target=\"_blank\" data-type=\"link\" data-id=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/numpy-wstep-do-biblioteki-python\/\" rel=\"noreferrer noopener\">biblioteki NumPy<\/a> (\u2018np\u2019), o kt\u00f3rej pisa\u0142em w jednym z poprzednich artyku\u0142\u00f3w.\u00a0\u00a0<\/p>\n\n\n\n<p>Przyk\u0142adowo, je\u015bli chcieliby\u015bmy stworzy\u0107 DataFrame (<strong>jedn\u0105 z kluczowych struktur danych w Pandas<\/strong>), kod wygl\u0105da\u0142by nast\u0119puj\u0105co:&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\ndata = {\n\n\u00a0\u00a0\u00a0 'column_1': [3, 2, 0, 1],\n\n\u00a0\u00a0\u00a0 'column_2': [0, 3, 7, 2]\n\n}\n\nexample_df = pd.DataFrame(data)\n\nprint(example_df)<\/pre>\n\n\n\n<p>Jak wida\u0107 na powy\u017cszym przyk\u0142adzie, u\u017cy\u0142em klasy DataFrame, podstawowej struktury, kt\u00f3r\u0105 udost\u0119pnia nam Pandas. W kolejnym rozdziale om\u00f3wimy inne dwie podstawowe struktury danych \u2013 <strong>Series <\/strong>i <strong>DataFrame<\/strong>.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Ramki-danych-i-serie-\u2013-Pandas-DataFrame-i-Series-\">Ramki danych i serie \u2013 Pandas DataFrame i Series&nbsp;<\/h2>\n\n\n\n<p>G\u0142\u00f3wnym celem biblioteki Pandas jest u\u0142atwienie pracy z danymi, dlatego Pandas wprowadza dwie struktury danych: <strong>Series <\/strong>i <strong>DataFrame<\/strong>. Zrozumienie tych struktur jest kluczowe do efektywnego korzystania z tej biblioteki.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Series&nbsp;<\/h3>\n\n\n\n<p><strong>Series to jednowymiarowa struktura danych, a w\u0142a\u015bciwie tablicy (ndarray), podobna do listy lub kolumny w tabeli.<\/strong> Ka\u017cdy element (np. liczby ca\u0142kowite, listy, obiekty, tuple) w Series ma przypisany identyfikator, kt\u00f3ry nazywany jest indeksem. Series przechowuje dane jednego typu.&nbsp;<\/p>\n\n\n\n<p>Przyk\u0142adowo, stworzenie Series, kt\u00f3ry zawiera list\u0119 element\u00f3w, mo\u017ce wygl\u0105da\u0107 tak:&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\nvals_sr = pd.Series([\"Val_1\", \"Val_2\", \"Val_3\", \"Val_4\", \"Val_5\"])\n\nprint(vals_sr)<\/pre>\n\n\n\n<p>Je\u017celi chodzi o indeks, to domy\u015blnie s\u0105 to liczby ca\u0142kowite (<strong>integer<\/strong>), zaczynaj\u0105c od zera. Indeks mo\u017cna zmieni\u0107, np. nadaj\u0105c etykiety. W takim przypadku nale\u017cy rozszerzy\u0107 nasz kod odpowiedzialny za tworzenie Series. S\u0142u\u017cy do tego parametr index, a kod wygl\u0105da nast\u0119puj\u0105co:&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\nvals_sr = pd.Series([\"Val_1\", \"Val_2\", \"Val_3\", \"Val_4\", \"Val_5\"], index=[\"A\", \"B\", \"C\", \"D\", \"E\"])\n\nprint(vals_sr)<\/pre>\n\n\n\n<p>Warto pami\u0119ta\u0107, \u017ce liczba \u201cetykiet\u201d powinna odpowiada\u0107 liczbie element\u00f3w w Series. W przeciwnym razie Python interpreter zwr\u00f3ci nam b\u0142\u0105d (<strong>ValueError<\/strong>). Je\u017celi nie chcesz wy\u015bwietla\u0107 ca\u0142ego Series, a jedynie sprawdzi\u0107, jakie indeksy zosta\u0142y nadane lub wy\u015bwietli\u0107 tylko warto\u015bci bez indeks\u00f3w, mo\u017cesz skorzysta\u0107 z nast\u0119puj\u0105cego fragmentu kodu:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\nvals_sr = pd.Series([\"Val_1\", \"Val_2\", \"Val_3\", \"Val_4\", \"Val_5\"], index=[\"A\", \"B\", \"C\", \"D\", \"E\"])\n\nprint(vals_sr)\n\nprint(vals_sr.index) # -- zwraca obiekty typu Index\n\nprint(vals_sr.values) # -- zwraca obiekt typu ndarray<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">DataFrame<\/h3>\n\n\n\n<p><strong>DataFrame to dwuwymiarowa struktura danych podobna do tabeli w bazie danych lub arkusza kalkulacyjnego Excela<\/strong>. DataFrame sk\u0142ada si\u0119 z wierszy i kolumn \u2013 ka\u017cda kolumna w DataFrame to Series. Jak pewnie si\u0119 domy\u015blasz, mimo \u017ce dana kolumna zawiera tylko jeden typ danych, to DataFrame mo\u017ce zawiera\u0107 wiele kolumn, z kt\u00f3rych ka\u017cda ma dane innego typu. Przyk\u0142adem mo\u017ce by\u0107 utworzenie DataFrame z danych na temat transakcji dokonywanych przez klient\u00f3w, kt\u00f3rych identyfikujemy po ID.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\nct_data = {\n\n\u00a0\u00a0\u00a0 'client_id': ['C34P', 'C35S', 'C35P', 'C97S', 'C58S'],\n\n\u00a0\u00a0\u00a0 'card_transactions': [11, 244, 31, 458, 63]\n\n}\n\nclient_transaction_df = pd.DataFrame(ct_data)\n\nprint(client_transaction_df)<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Wczytywanie-danych-z-r\u00f3\u017cnych-\u017ar\u00f3de\u0142\">Wczytywanie danych z r\u00f3\u017cnych \u017ar\u00f3de\u0142<\/h2>\n\n\n\n<p>Jedn\u0105 z najwa\u017cniejszych zalet biblioteki Pandas jest \u0142atwo\u015b\u0107, z jak\u0105 mo\u017cna wczyta\u0107 dane z r\u00f3\u017cnych \u017ar\u00f3de\u0142 i format\u00f3w plik\u00f3w. Do najpopularniejszych nale\u017c\u0105:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CSV&nbsp;<\/li>\n\n\n\n<li>Excel (.xlsx)&nbsp;<\/li>\n\n\n\n<li>SQL&nbsp;<\/li>\n\n\n\n<li>Pliki p\u0142askie (flat files, np. plik tekstowy)&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Dane z pliku CSV mo\u017cna wczyta\u0107 do DataFrame za pomoc\u0105 funkcji <strong>pd.read_csv().<\/strong>&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\ndf = pd.read_csv('path_to_your_file.csv')\n\nprint(df)<\/pre>\n\n\n\n<p>Podobnie, mo\u017cemy wczyta\u0107 plik Excela za pomoc\u0105 funkcji <strong>pd.read_excel().<\/strong>&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\ndf = pd.read_excel('path_to_your_file.xlsx')\n\nprint(df)<\/pre>\n\n\n\n<p>Aby wczyta\u0107 wynik zapytania SQL, musimy najpierw utworzy\u0107 po\u0142\u0105czenie do bazy danych. Na przyk\u0142adzie bazy danych <strong>SQLite <\/strong>mo\u017cemy zrobi\u0107 to w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\nimport sqlite3\n\n# Ustanawianie po\u0142\u0105czenia do bazy danych\n\nconn = sqlite3.connect(\"database_name.db\")\n\n# Wykonanie zapytania\n\ndf = pd.read_sql_query(\"SELECT * FROM my_table\", conn)\n\nprint(df)<\/pre>\n\n\n\n<p>Zak\u0142adaj\u0105c, \u017ce korzystasz z innej bazy danych, musisz zainstalowa\u0107 odpowiedni sterownik dla Pythona i zast\u0105pi\u0107 sqlite3.connect odpowiednim po\u0142\u0105czeniem. Je\u017celi chcesz dowiedzie\u0107 si\u0119 wi\u0119cej na temat sqlite, zach\u0119cam ci\u0119 do odwiedzenia dokumentacji <a href=\"https:\/\/docs.python.org\/3\/library\/sqlite3.html#module-sqlite3\" target=\"_blank\" rel=\"noreferrer noopener\">sqlite3<\/a>.<\/p>\n\n\n\n<p>W nast\u0119pnym rozdziale om\u00f3wimy podstawowe operacje na danych z wykorzystaniem Series i DataFrame.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Podstawowe-operacje-na-danych\">Podstawowe operacje na danych<\/h2>\n\n\n\n<p>Kiedy ju\u017c wiesz, jak wczyta\u0107 dane za pomoc\u0105 biblioteki Pandas, skupimy si\u0119 teraz na wybieraniu, filtrowaniu i sortowaniu danych oraz zastosowaniu funkcji<strong> apply i map.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Wybieranie,-filtrowanie-i-sortowanie-danych\">Wybieranie, filtrowanie i sortowanie danych<\/h2>\n\n\n\n<p>Jedn\u0105 z podstawowych i najcz\u0119\u015bciej u\u017cywanych operacji jest wybieranie okre\u015blonych danych z DataFrame. Pandas umo\u017cliwia wybieranie danych na wiele sposob\u00f3w:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wybieranie kolumn: <strong>df[&#8217;nazwa_kolumny&#8217;]<\/strong>&nbsp;<\/li>\n\n\n\n<li>Wybieranie wierszy za pomoc\u0105 numer\u00f3w indeks\u00f3w: <strong>df.iloc[indeks]<\/strong>&nbsp;<\/li>\n\n\n\n<li>Wybieranie wierszy za pomoc\u0105 etykiet indeks\u00f3w: <strong>df.loc[etykieta]<\/strong><\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Przyk\u0142adowy fragment kodu zamieszczam poni\u017cej:&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\nct_data = {\n\n\u00a0\u00a0\u00a0 'client_id': ['C34P', 'C35S', 'C35P', 'C97S', 'C58S'],\n\n\u00a0\u00a0\u00a0 'count': [11, 244, 31, 458, 63]\n\n}\n\ndf = pd.DataFrame(ct_data)\n\nprint(df)\n\n# Wybieranie kolumny 'client_id'\n\nprint(df['client_id'])\n\n\u00a0\n\n# Wybieranie pierwszego wiersza\n\nprint(df.iloc[0])\n\n# Wybieranie wiersza o etykiecie indeksu zero\n\nprint(df.loc[0])<\/pre>\n\n\n\n<p>Filtrowanie to proces wybierania podzbioru danych na podstawie zadanych kryteri\u00f3w. Przyk\u0142adowo, mo\u017cemy chcie\u0107 wybra\u0107 tylko te transakcje, kt\u00f3re s\u0105 dost\u0119pne w ilo\u015bci wi\u0119kszej ni\u017c 60:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">filtered_df = df[df['count'] > 60]\n\nprint(filtered_df)<\/pre>\n\n\n\n<p>Sortowanie danych jest prostym procesem, kt\u00f3ry mo\u017cemy przeprowadzi\u0107 za pomoc\u0105 metody <strong>sort_values()<\/strong>:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sorted_df = df.sort_values('count')\n\nprint(sorted_df)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Operacje na kolumnach: dodawanie, usuwanie, zmiana nazw<\/h3>\n\n\n\n<p>Aby doda\u0107 now\u0105 kolumn\u0119 do DataFrame, mo\u017cemy po prostu przypisa\u0107 dane do nowej kolumny, jak w poni\u017cszym przyk\u0142adzie:&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df['amount'] = [1200, 4500, 3000, 28000, 700] # -- dodajemy kolumn\u0119 z sum\u0105 kwot, na kt\u00f3re wykonano transakcje\n\nprint(df)\n<\/pre>\n\n\n\n<p>Aby usun\u0105\u0107 kolumn\u0119, skorzystamy z metody <strong>drop()<\/strong>:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df = df.drop('amount', axis=1)\n\nprint(df)<\/pre>\n\n\n\n<p>Zmiana nazwy kolumny jest mo\u017cliwa za pomoc\u0105 metody <strong>rename()<\/strong>:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df = df.rename(columns={'client_id': 'client_code', 'count': 'quantity'})\n\nprint(df)<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"U\u017cycie-funkcji-apply-i-map\">U\u017cycie funkcji apply i map<\/h2>\n\n\n\n<p>Funkcje apply i map pozwalaj\u0105 na zastosowanie wybranej funkcji do ka\u017cdego elementu zapisanego w Series lub DataFrame. Przyk\u0142adowo, u\u017cycie funkcji z biblioteki NumPy dla kolumny \u2018quantity\u2019.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n\ndf['log_quantity'] = df['quantity'].apply(np.log)\n\nprint(df)<\/pre>\n\n\n\n<p>Metoda map jest podobna do apply, ale dzia\u0142a tylko na Series. Jest cz\u0119sto u\u017cywana do zamiany warto\u015bci na podstawie s\u0142ownika. Przyk\u0142adowo, dla listy klient\u00f3w chcemy doda\u0107 dodatkow\u0105 cyfr\u0119 w identyfikatorze.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">code_map = {\n\n\u00a0\u00a0\u00a0 'C34P': '0C34P',\n\n\u00a0\u00a0\u00a0 'C35S': '1C35S',\n\n\u00a0\u00a0\u00a0 'C35P': '1C35P',\n\n\u00a0\u00a0\u00a0 'C97S': '0C97S',\n\n\u00a0\u00a0\u00a0 'C58S': '0C58S'\n\n}\n\ndf['client_code'] = df['client_code'].map(code_map)\n\nprint(df)<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Czyszczenie-i-naprawa-brakuj\u0105cych-danych\">Czyszczenie i naprawa brakuj\u0105cych danych<\/h2>\n\n\n\n<p>Praca z danymi, kt\u00f3re pochodz\u0105 ze \u017ar\u00f3de\u0142 rzeczywistych, praktycznie zawsze wi\u0105\u017ce si\u0119 z konieczno\u015bci\u0105 ich czyszczenia lub poprawiania. Cz\u0119sto dane zawieraj\u0105 braki, duplikaty lub typy danych, kt\u00f3re nie s\u0105 odpowiednie do planowanej analizy. W tym rozdziale om\u00f3wi\u0119 proste sytuacje i poka\u017c\u0119 ci,&nbsp;jak radzi\u0107 sobie z takimi problemami za pomoc\u0105 narz\u0119dzi z biblioteki Pandas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Obs\u0142uga brakuj\u0105cych danych (NaN)<\/h3>\n\n\n\n<p>Brakuj\u0105ce dane s\u0105 oznaczane jako <strong>NaN (Not a Number)<\/strong>. Pandas oferuje kilka metod do obs\u0142ugi brakuj\u0105cych danych i s\u0105 to np.:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wype\u0142nianie brakuj\u0105cych danych okre\u015blon\u0105 warto\u015bci\u0105&nbsp;<\/li>\n\n\n\n<li>Usuwanie wierszy z brakuj\u0105cymi danymi&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Metoda<strong> fillna() <\/strong>pozwala na wype\u0142nienie brakuj\u0105cych danych okre\u015blon\u0105 warto\u015bci\u0105 lub za pomoc\u0105 okre\u015blonej metody (np. &#8217;<strong>forward fill<\/strong>&#8217;&nbsp; \u2013 <strong>ffill<\/strong>, &#8217;<strong>backward fill<\/strong>&#8217;&nbsp; \u2013 <strong>bfill<\/strong>):&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n\ndata = {\n\n\u00a0\u00a0\u00a0 'A': [1, 2, np.nan],\n\n\u00a0\u00a0\u00a0 'B': [5, np.nan, np.nan],\n\n\u00a0\u00a0\u00a0 'C': [1, 2, 3]\n\n}\n\ndf = pd.DataFrame(data)\n\ndf_filled_zeros = df.fillna(value=0)\u00a0 # --Wype\u0142niamy brakuj\u0105ce dane warto\u015bci\u0105 0\n\nprint(df_filled_zeros)<\/pre>\n\n\n\n<p>Mo\u017cliwe jest te\u017c usuni\u0119cie wierszy, kt\u00f3re zawieraj\u0105 brakuj\u0105ce dane. W przypadku du\u017cego zbioru i niewielkiej liczby \u201czepsutych\u201d wierszy nie powinno mie\u0107 to du\u017cego wp\u0142ywu na jako\u015b\u0107 danych, ale przy niewielkim zbiorze usuni\u0119cie kilku wierszy mo\u017ce znacz\u0105co wp\u0142yn\u0105\u0107 na p\u00f3\u017aniejsz\u0105 analiz\u0119. Je\u017celi jednak zdecydujesz si\u0119 na usuni\u0119cie wybranych wierszy, to mo\u017cesz u\u017cy\u0107 metody <strong>dropna()<\/strong>:.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df_dropped = df.dropna()\u00a0 # Usuwamy wiersze z brakuj\u0105cymi danymi\n\nprint(df_dropped)<\/pre>\n\n\n\n<p>Czasami dochodzi do sytuacji, \u017ce w naszym zbiorze znajduje si\u0119 wiele duplikat\u00f3w, kt\u00f3re z punktu widzenia analizy s\u0105 zb\u0119dne. Usuni\u0119cie duplikat\u00f3w jest przydatne szczeg\u00f3lnie w sytuacji, gdy stanowi\u0105 one wi\u0119kszo\u015b\u0107 naszego zbioru. Pozbycie si\u0119 ich pozwoli na odci\u0105\u017cenie biblioteki i wydajniejsze operacje np. na kolumnach w DataFrame. Pandas dostarcza metod\u0119 <strong>drop_duplicates()<\/strong>, kt\u00f3ra pozwala na \u0142atwe usuni\u0119cie duplikat\u00f3w:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">data = {\n\n\u00a0\u00a0\u00a0 'client_id': ['C34P', 'C35S', 'C35P', 'C35P','C97S', 'C58S', 'C58S'],\n\n\u00a0\u00a0\u00a0 'count': [11, 244, 31, 31, 458, 63, 63]\n\n}\n\ndf = pd.DataFrame(data)\n\ndf = df.drop_duplicates()\u00a0 # Usuwamy duplikaty\n\nprint(df)<\/pre>\n\n\n\n<p>Wi\u0119cej o pracy z brakuj\u0105cymi danymi dowiesz si\u0119 z obszernej <a href=\"https:\/\/pandas.pydata.org\/docs\/user_guide\/missing_data.html\" target=\"_blank\" rel=\"noreferrer noopener\">dokumentacji na Pydata.org<\/a>.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Je\u017celi pracujesz na danych dostarczanych przez inne osoby lub firmy, mo\u017cesz spotka\u0107 si\u0119 z danymi numerycznymi (liczby ca\u0142kowite, cyfry, liczby zmiennoprzecinkowe), kt\u00f3re przedstawione s\u0105 jako ci\u0105gi znak\u00f3w (<strong>string<\/strong>). Czyli np. liczba ca\u0142kowita 200 w DataFrame zapisana jest jako string o warto\u015bci \u2018200\u2019. Interpreter potraktuje to jako tekst, a nie liczb\u0119. Je\u017celi chcesz wykonywa\u0107 na takich danych operacje statystyczne lub matematyczne, <strong>konieczne jest zmienienie typu danych kolumny<\/strong> (w tym przypadku z \u2018str\u2019 na \u2018int\u2019). Mo\u017cemy to zrobi\u0107 za pomoc\u0105 metody <strong>astype()<\/strong>:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\ndata = {\n\n\u00a0\u00a0\u00a0 'client_id': ['C34P', 'C35S', 'C35P', 'C97S', 'C58S'],\n\n\u00a0\u00a0\u00a0 'count': ['11', '244', '31', '458', '63']\n\n}\n\ndf = pd.DataFrame(data)\n\ndf['count'] = df['count'].astype(int)\u00a0 # Zmieniamy typ danych kolumny 'count' na int\n\nprint(df)<\/pre>\n\n\n\n<p>Podsumowuj\u0105c, czyszczenie danych to zazwyczaj niezb\u0119dny krok w procesie przetwarzania i analizy danych. Pandas oferuje wiele narz\u0119dzi, kt\u00f3re u\u0142atwiaj\u0105 ten proces. Je\u017celi chcesz dowiedzie\u0107 si\u0119 wi\u0119cej o pracy z plikami tekstowymi, oto link do dokumentacji: <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jak \u0142atwo wczytywa\u0107, przetwarza\u0107 i analizowa\u0107 dane w Pythonie? Poznaj darmow\u0105 bibliotek\u0119 w j\u0119zyku Python: Pandas.<\/p>\n","protected":false},"author":137,"featured_media":29126,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":4652,"footnotes":""},"categories":[1,582],"tags":[602],"offering":[522],"class_list":["post-29125","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","tag-python-2","offering-tech-blog"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/137"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=29125"}],"version-history":[{"count":2,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29125\/revisions"}],"predecessor-version":[{"id":32107,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29125\/revisions\/32107"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/29126"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=29125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=29125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=29125"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=29125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}