Pandas read_csv() w Python z Przykładem
⚡ Inteligentne podsumowanie
Funkcja Pandas read_csv() przekształca plik rozdzielony przecinkami, lokalny lub zdalny, w obiekt DataFrame w jednym wywołaniu. Ten przewodnik importuje zbiór danych spisu ludności UCI dla dorosłych, nadaje nazwy piętnastu kolumnom i podsumowuje wynik za pomocą agregacji groupby.
Zaimportuj plik CSV do Pand
W samouczku TensorFlow będziesz używać zbiór danych dla dorosłych, który jest często używany do zadań klasyfikacyjnych. Poniżej znajduje się plik surowy adult.data eksport z repozytorium uczenia maszynowego UCI, a strona zestawu danych oferuje również możliwość pobrania pliku w formacie ZIP i ucimlrepo pakietu, jeśli ścieżka bezpośrednia przestanie być rozwiązywana.
Dane są przechowywane w formacie CSV. Zbiór danych zawiera 8 zmiennych kategorycznych:
- klasa pracy
- Edukacja
- małżeński
- zawód
- związek
- wyścig
- seks
- ojczyźnie
I 6 zmiennych ciągłych:
- wiek
- fnlwgt
- edukacja_num
- zysk kapitałowy
- strata_kapitału
- godziny_tydzień
Razem z dochodem label kolumna, co daje 15 nazw kolumn, do których przekażesz Pandy w następnej sekcji.
Metoda pandy read_csv().
Aby zaimportować zbiór danych CSV, możesz użyć obiektu pd.read_csv(). Podstawowy podpis to:
Składnia pand read_csv().
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- ścieżka_pliku_lub_bufor: ścieżka, URLlub obiekt podobny do pliku przechowujący dane
- sep=',':rozgranicznik do użycia
- nazwy=Brak:Nazwij kolumny. Jeśli zbiór danych ma dziesięć kolumn, musisz podać dziesięć nazw.
- index_col=Brak: która kolumna ma być używana jako indeks wiersza. Podaj False, aby wymusić nowy indeks całkowity.
- skipinitialspace=Fałsz: pomiń spacje po ograniczniku
Aby zapoznać się z pełną listą argumentów, sprawdź oficjalną stronę dokumentacja pandas.read_csv().
Pandy read_csv() Przykład
Poniższy fragment kodu wymienia wszystkie 15 kolumn, wskazuje na plik UCI i usuwa spację po każdym przecinku w tym konkretnym zestawie danych.
## Import csv import pandas as pd ## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_train.shape
Wyjście:
(32561, 15)
Kształt potwierdza 32 561 wierszy i 15 kolumn, więc każda nazwa w kolumnach COLUMNS została dopasowana do pola w pliku.
Kluczowe parametry read_csv() Pandas
Funkcja read_csv() akceptuje ponad pięćdziesiąt argumentów, ale niewielka grupa obejmuje niemal wszystkie rzeczywiste importy. Poniższe wartości domyślne są udokumentowane w bieżącym dokumencie API Pandas.
| Parametr | Domyślnie | Co to robi |
| września | „,” | Znak lub wyrażenie regularne używane jako separator. W przypadku innych formatów użyj sep=';' lub sep='\t'. |
| nagłówek | 'wywnioskować' | Numer wiersza zawierający etykiety kolumn. Przekaż nagłówek=Brak, jeśli plik nie ma wiersza nagłówka. |
| Nazwy | nie ustawiony | Jawna lista etykiet kolumn. Połącz z header=0, aby zastąpić istniejący nagłówek. |
| kolumna_indeksu | żaden | Kolumna, która ma zostać użyta jako indeks wiersza. index_col=False wymusza zwykły indeks całkowity. |
| usecols | żaden | Podzbiór kolumn do załadowania według etykiety lub pozycji. Skraca czas analizy i zmniejsza zużycie pamięci. |
| dtyp | żaden | Typy danych dla każdej kolumny, na przykład {'age': 'int32'}. Pomija wnioskowanie o typie. |
| wartości_na | żaden | Dodatkowe ciągi znaków odczytywane jako NaN, takie jak symbol zastępczy „?” w zestawie danych dla dorosłych. |
| pomija / pomija | żaden | Pomiń wiodące linie lub odczytaj tylko pierwsze N wierszy danych. |
| parse_dates | żaden | Kolumny, które mają zostać przekonwertowane na datę i godzinę podczas odczytu, w połączeniu z parametrem date_format. |
| kodowanie | 'utf-8' | Kodowanie tekstu pliku. Użyj „latin-1” lub „cp1252” w przypadku starszych eksportów. |
| wielkość kawałka | żaden | Zwraca iterator, który zwraca plik w blokach po N wierszy. |
| na_złych_liniach | 'błąd' | Co zrobić z nieprawidłowo sformatowanymi wierszami: zgłosić błąd, wysłać ostrzeżenie lub pominąć. |
Dwa z nich zasługują na uwagę. index_col=False nie jest tym samym, co pozostawienie go nieustawionym: wyraźnie mówi Pandasowi, aby nie promował pierwszej kolumny, co jest pożądane, gdy plik kończy każdy wiersz przypadkowym ogranicznikiem. I names po cichu nadpisuje wszystko, co deklaruje plik, więc przekaż header=0 obok niego, gdy plik CSV rzeczywiście zawiera wiersz nagłówka.
Metoda groupby() Pand
Łatwym sposobem na przeglądanie danych jest użycie metody groupby. Metoda ta pozwala na podsumowanie danych według grup. Poniżej znajduje się lista agregacji dostępnych za pomocą metody groupby():
- liczyć: liczyć
- min: min
- maks.: maks
- znaczy: znaczy
- mediana: mediana
- odchylenie standardowe: std
- i inni
Wewnątrz funkcji groupby() przed zastosowaniem agregacji należy podać nazwę kolumny, według której chcemy grupować.
Przyjrzyjmy się pojedynczej grupieping z zestawem danych dla dorosłych. Otrzymasz średnią wszystkich zmiennych ciągłych według rodzaju przychodów, czyli powyżej lub poniżej 50 tys.:
df_train.groupby(['label']).mean()
| etykieta | wiek | fnlwgt | edukacja_num | zysk kapitałowy | strata_kapitału | godziny_tydzień |
| <= 50 tys | 36.783738 | 190340.86517 | 9.595065 | 148.752468 | 53.142921 | 38.840210 |
| > 50K | 44.249841 | 188005.00000 | 11.611657 | 4006.142456 | 195.001530 | 45.473026 |
Minimalny wiek można uzyskać według rodzaju gospodarstwa domowego:
df_train.groupby(['label'])['age'].min() label <=50K 17 >50K 19 Name: age, dtype: int64
Możesz również grupować według wielu kolumn. Na przykład możesz uzyskać maksymalny zysk kapitałowy według rodzaju gospodarstwa domowego i stanu cywilnego.
df_train.groupby(['label', 'marital'])['capital_gain'].max() label marital <=50K Divorced 34095 Married-AF-spouse 2653 Married-civ-spouse 41310 Married-spouse-absent 6849 Never-married 34095 Separated 7443 Widowed 6849 >50K Divorced 99999 Married-AF-spouse 7298 Married-civ-spouse 99999 Married-spouse-absent 99999 Never-married 99999 Separated 99999 Widowed 99999 Name: capital_gain, dtype: int64
Możesz utworzyć wykres po wykonaniu operacji groupby. Jednym ze sposobów jest bezpośrednie wykreślenie wyniku grupowania.
Aby uzyskać bardziej przejrzysty wykres, zastosuj funkcję unstack() po funkcji mean(), aby stan cywilny przeniósł się z indeksu do kolumn. Wykres będzie miał wtedy dwie grupy, po jednej dla każdej etykiety dochodu, zamiast czternastu (2*7) słupków, które generowałby płaski indeks wielopoziomowy.
Jeśli używasz Jupyter Notatnikpamiętaj o dodaniu %matplotlib inline, w przeciwnym razie wykres nie zostanie wyświetlony.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
Przedstawienie tej nieułożonej klatki w postaci wykresu słupkowego daje poniższy wykres.
Jak odczytywać duże pliki CSV za pomocą Pandas
Zbiór danych dla dorosłych jest niewielki, ale to samo wywołanie może się zaciąć przy eksporcie wielogigabajtowym. Trzy argumenty wykonują większość pracy.
- usecols Ładuje tylko te kolumny, których faktycznie potrzebujesz. Dokumentacja Pandasa informuje, że skutkuje to znacznie szybszym przetwarzaniem i mniejszym zużyciem pamięci.
- dtyp przypina każdą kolumnę do typu, więc Pandas pomija wnioskowanie i domyślnie nie rozszerza liczb całkowitych do 64 bitów.
- wielkość kawałka zwraca obiekt TextFileReader zamiast DataFrame, umożliwiając pętlenie bloków N wierszy i agregację w miarę postępu.
import pandas as pd # read only the columns you need, with explicit types cols = ['age', 'education', 'capital_gain', 'label'] types = {'age': 'int32', 'capital_gain': 'int32'} df = pd.read_csv(PATH, names=COLUMNS, usecols=cols, dtype=types, skipinitialspace=True, index_col=False) # stream the file in fixed-size chunks instead of loading it whole total = 0 for chunk in pd.read_csv(PATH, names=COLUMNS, chunksize=10000, skipinitialspace=True, index_col=False): total = total + len(chunk) print(total)
Gdy już podstawy są na swoim miejscu, pomocne okazują się dwie kolejne opcje. engine='pyarrow' przełącza się na wielowątkowy parser Arrow i dtype_backend='pyarrow' zachowuje wynik w kolumnach z tyłem Arrowa. low_memory domyślnie ma wartość True, co oznacza, że plik jest analizowany wewnętrznie w częściach, ale może powodować powstawanie mieszanych typów w kolumnie; ustaw jawny typ danych zamiast polegać na nim.
Wreszcie, compression='infer' oznacza, że ścieżka kończąca się rozszerzeniem .gz, .zip, .bz2, .xz lub .zst jest dekompresowana na bieżąco, więc nie ma potrzeby rozpakowywania archiwum przed jego odczytaniem.
Typowe błędy read_csv() w Pandas i jak je naprawić
Większość błędów read_csv() wynika z czterech przyczyn i każda z nich ma udokumentowany argument rozwiązujący problem.
| Błąd | Spowodować | Fix |
| Błąd pliku nie znaleziono | Ścieżka jest względna w stosunku do katalogu roboczego, a nie do skryptu. | Użyj ścieżki absolutnej lub potwierdź URL schemat jest jednym z http, ftp, s3, gs lub file. |
| Błąd dekodowania Unicode | Plik nie jest w formacie UTF-8, co jest domyślnym kodowaniem. | Przekaż encoding='latin-1′ lub poprawny kodek, lub encoding_errors='replace'. |
| ParserError: Błąd tokenizacji danych | Wiersz zawiera więcej pól, niż deklaruje nagłówek. | Przekaż on_bad_lines='skip' lub 'warn', lub ustaw poprawny sep. |
| Ostrzeżenie typu D: kolumny mają mieszane typy | Wnioskowanie typu fragmentarycznego ujawniło różne typy w jednej kolumnie. | Ustaw jawny typ danych lub low_memory=False. |
| Kolumny przesunięte o jedną | Dodanie końcowego ogranicznika powoduje, że Pandas awansuje pierwsze pole do indeksu. | Przekaż index_col=False. |
Zbiór danych dla dorosłych bezpośrednio ukazuje przypadek wartości brakujących: nieznane wpisy dotyczące klasy pracy, zawodu i kraju natywnego są przechowywane jako dosłowny znak zapytania, więc pojawiają się jako ciąg znaków „?”, chyba że zostaną zadeklarowane.
# tolerate rows with too many fields instead of raising df = pd.read_csv(PATH, names=COLUMNS, on_bad_lines='skip') # read a file that is not UTF-8 df = pd.read_csv('sales.csv', encoding='latin-1') # treat the dataset's '?' placeholder as a missing value df = pd.read_csv(PATH, names=COLUMNS, na_values='?', skipinitialspace=True)

