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.

  • 🔘 Jeden telefon: pd.read_csv() akceptuje ścieżkę do pliku, URLlub dowolny obiekt udostępniający metodę odczytu.
  • Kontrola kolumny: Przekaż nazwy, aby oznaczyć kolumny, i index_col=False, aby zachować zwykły indeks całkowity.
  • Biała przestrzeń: skipinitialspace=True usuwa spację następującą po każdym przecinku w zestawie danych dla dorosłych.
  • 🧪 Grupa i agregat: groupby() podsumowuje ramkę podając liczbę, wartość minimalną, maksymalną, średnią, medianę lub odchylenie standardowe.
  • 🛠️. Duże pliki: usecols, dtype i chunksize redukują czas analizy i ilość pamięci w przypadku eksportów wielogigabajtowych.
  • ⚠️ Powszechne błędy: Kodowanie, błędne linie i mieszane typy danych mają udokumentowany argument, który je naprawia.

Pandy read_csv() z przykładem

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.

Wykres słupkowy grupowy średniego zysku kapitałowego według kategorii dochodu i stanu cywilnego

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)

FAQ

Obie funkcje wywołują ten sam parser. Funkcja read_csv() domyślnie używa separatora przecinkowego, podczas gdy read_table() odczytuje plik z separatorem ogólnym i wymaga samodzielnego ustawienia separatora sep. Użyj read_csv() dla plików z separatorem przecinkowym, a read_table() dla eksportów rozdzielonych tabulatorem lub pionową kreską.

Wywołaj df.to_csv('output.csv', index=False). Usuńping Indeks unika nienazwanej pierwszej kolumny przy następnym odczycie. Dodaj argumenty sep, kodowania lub kompresji, aby odzwierciedlić ustawienia użyte podczas importowania pliku.

Przekaż parse_dates z nazwami kolumn lub pozycjami i dodaj date_format, jeśli układ nie jest zgodny z ISO 8601, na przykład date_format='%d/%m/%Y'. Bez tego kolumny dat są dostarczane jako zwykłe ciągi obiektów i wymagają osobnego wywołania to_datetime.

Ustaw sep na znak, taki jak sep=';' lub sep='\t'. Separatory dłuższe niż jeden znak są traktowane jako wyrażenia regularne i wymuszają wolniejsze Python engine.sep=None pozwala silnikowi na wykrycie ogranicznika z pierwszego prawidłowego wiersza.

Użyj parametru „nrows”, aby ograniczyć liczbę zwracanych wierszy danych, a parametru „skiprows”, aby pominąć blok początkowych wierszy. Łącząc je, można prześledzić strony pliku, na przykład „skiprows=1000000” z „nrows=999999”, aby odczytać drugi milion wierszy.

Tak. Domyślną metodą kompresji jest „infer”, więc ścieżka kończąca się rozszerzeniem .gz, .zip, .bz2, .xz lub .zst zostanie automatycznie zdekompresowana. URLWszystkie operacje wykonywane są za pomocą protokołów http, ftp, s3, gs lub file, a storage_options przekazuje dane uwierzytelniające do zdalnego zaplecza.

Wytrenowane modele sygnalizują prawdopodobne błędy typu, grupują niemal zduplikowane zapisy kategorii i imputują brakujące wartości z otaczających kolumn. To zawęża ręczne czyszczenie do wierszy, których ustawienie na_values ​​lub dtype oparte na regułach nie jest w stanie samodzielnie rozwiązać.

Copilot szybko tworzy szablon po wyświetleniu próbki pliku. Listę argumentów należy traktować jako wersję roboczą, ponieważ program często zgaduje typ danych (dtype) i kodowanie. Przed uruchomieniem należy sprawdzić każde wygenerowane słowo kluczowe pod kątem referencji API Pandas.

Podsumuj ten post następująco: