Pande read_csv() u Python s Primjerom

⚡ Pametni sažetak

Pandasova funkcija read_csv() pretvara datoteku odvojenu zarezima, lokalnu ili udaljenu, u DataFrame u jednom pozivu. Ovaj vodič uvozi skup podataka popisa odraslih UCI-ja, imenuje njegovih petnaest stupaca i sažima rezultat pomoću agregacija groupby.

  • 🔘 Jedan poziv: pd.read_csv() prihvaća putanju datoteke, a URLili bilo koji objekt koji otkriva metodu čitanja.
  • ☑️ Kontrola stupca: Proslijedite imena za označavanje stupaca i index_col=False za zadržavanje običnog cjelobrojnog indeksa.
  • Bijeli prostor: skipinitialspace=True uklanja razmak koji slijedi svaki zarez u skupu podataka za odrasle.
  • 🧪 Grupa i agregacija: groupby() sažima okvir s brojem, minimumom, maksimumom, prosjekom, medijanom ili standardom.
  • 🛠️ Velike datoteke: usecols, dtype i chunksize smanjuju vrijeme parsiranja i memoriju kod izvoza od više gigabajta.
  • ⚠️ Uobičajene pogreške: Kodiranje, loše linije i miješani dtipovi imaju dokumentirani argument koji ih ispravlja.

Pandas read_csv() s primjerom

Uvezi CSV u Pandas

Tijekom TensorFlow tutoriala, koristit ćete skup podataka za odrasle, koji se često koristi za zadatke klasifikacije. Datoteka korištena u nastavku je sirovi adult.data izvoz iz UCI repozitorija strojnog učenja, a stranica sa skupom podataka također nudi preuzimanje u zip formatu i ucimlrepo paket ako izravni put ikada prestane rješavati.

Podaci se pohranjuju u CSV formatu. Skup podataka uključuje 8 kategoričkih varijabli:

  • radna klasa
  • obrazovanje
  • bračni
  • okupacija
  • odnos
  • utrka
  • seks
  • rodna_zemlja

I 6 kontinuiranih varijabli:

  • starost
  • fnlwgt
  • obrazovanje_br
  • kapitalni dobitak
  • gubitak_kapitala
  • sati_tjedan

Zajedno s prihodima label stupac, što čini 15 naziva stupaca kojima ćete proslijediti pande u sljedećem odjeljku.

Metoda Pandas read_csv().

Za uvoz CSV skupa podataka možete koristiti objekt pd.read_csv(). Osnovni potpis je:

Pandas read_csv() Sintaksa

pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
  • filepath_or_buffer: put, URLili objekt nalik datoteci koji sadrži podatke
  • sep=',': razdjelnik koji treba koristiti
  • imena=Nijedan: imenujte stupce. Ako skup podataka ima deset stupaca, morate proslijediti deset naziva
  • index_col=Ništa: koji stupac koristiti kao indeks retka. Proslijedite vrijednost False za prisilno korištenje novog cijelobrojnog indeksa
  • skipinitialspace=False: preskoči razmake nakon razdjelnika

Za potpuni popis argumenata, provjerite službenu stranicu Dokumentacija za pandas.read_csv().

Pandas read_csv() Primjer

Isječak u nastavku imenuje svih 15 stupaca, pokazuje na UCI datoteku i uklanja razmak koji slijedi svaki zarez u ovom određenom skupu podataka.

## 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

Izlaz:

(32561, 15)

Oblik potvrđuje 32 561 redaka i 15 stupaca, tako da je svako ime u COLUMNS usklađeno s poljem u datoteci.

Ključni parametri Pandas read_csv()

read_csv() prihvaća više od pedeset argumenata, ali mala skupina pokriva gotovo svaki stvarni uvoz. Zadane vrijednosti u nastavku su one dokumentirane u trenutnoj referenci pandas API-ja.

Parametar Zadano Ono što se također
rujna „” Znak ili regularni izraz koji se koristi kao razdjelnik. Za ostale formate koristite sep=';' ili sep='\t'.
zaglavlje 'zaključiti' Broj retka koji sadrži oznake stupaca. Proslijedi zaglavlje=None kada datoteka nema redak zaglavlja.
imena nespreman Eksplicitni popis oznaka stupaca. Kombinirajte s header=0 kako biste zamijenili postojeće zaglavlje.
stupac_indexa nijedan Stupac koji će se koristiti kao indeks retka. index_col=False prisiljava običan cjelobrojni indeks.
usecols nijedan Podskup stupaca za učitavanje, prema oznaci ili poziciji. Smanjuje vrijeme parsiranja i memoriju.
dtype nijedan Tipovi podataka po stupcu, na primjer {'age': 'int32'}. Preskače zaključivanje tipa.
na_vrijednosti nijedan Dodatni nizovi koji se čitaju kao NaN, kao što je rezervirano mjesto '?' u skupu podataka za odrasle.
preskoči redove / redove nijedan Preskoči vodeće retke ili pročitaj samo prvih N redaka podataka.
datumi_raščlanjivanja nijedan Stupci za pretvaranje u datum i vrijeme tijekom čitanja, upareni s formatom_data.
kodiranje 'utf-8' Kodiranje teksta datoteke. Za naslijeđene izvoze koristite 'latin-1' ili 'cp1252'.
veličina komada nijedan Vrati iterator koji vraća datoteku u blokovima od N redaka.
na lošim linijama 'greška' Što učiniti s deformiranim retcima: podići ih, upozoriti ili preskočiti.

Dva od njih zaslužuju pažnju. index_col=False nije isto što i ostaviti ga nepostavljenim: izričito govori Pandasu da ne promovira prvi stupac, što je ono što želite kada datoteka završava svaki redak s neispravnim razdjelnikom. names tiho prepisuje sve što datoteka deklarira, pa proslijedi header=0 uz njega kada CSV zaista sadrži redak zaglavlja.

Pandas groupby() metoda

Jednostavan način za pregled podataka je korištenje metode groupby. Ova metoda vam može pomoći u sažimanju podataka po grupama. U nastavku je popis agregacija dostupnih metodom groupby():

  • brojati: brojati
  • min: min
  • max: maks
  • značiti: značiti
  • medijan: medijan
  • standardna devijacija: std
  • i drugi

Unutar groupby() funkcije, imenujete stupac koji želite grupirati prije primjene agregacije.

Pogledajmo jednu skupinuping s skupom podataka za odrasle. Dobit ćete srednju vrijednost svih kontinuiranih varijabli prema vrsti prihoda, koji je iznad 50 tisuća ili ispod 50 tisuća:

df_train.groupby(['label']).mean()
oznaka starost fnlwgt obrazovanje_br kapitalni dobitak gubitak_kapitala sati_tjedan
<= 50K 36.783738 190340.86517 9.595065 148.752468 53.142921 38.840210
> 50 K 44.249841 188005.00000 11.611657 4006.142456 195.001530 45.473026

Minimalnu dob možete dobiti prema vrsti kućanstva:

df_train.groupby(['label'])['age'].min()
label
<=50K    17
>50K     19
Name: age, dtype: int64

Također možete grupirati prema više stupaca. Na primjer, možete ostvariti maksimalnu kapitalnu dobit prema vrsti kućanstva i bračnom statusu.

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žete stvoriti grafikon nakon grupiranja. Jedan od načina za to je izravno prikazivanje grupiranog rezultata.

Za jasniji grafikon, primijenite unstack() nakon mean() tako da se bračni status premjesti iz indeksa u stupce. Grafikon tada ima dvije grupe, jednu po oznaci prihoda, umjesto četrnaest (2*7) stupaca koje bi dao ravni višerazinski indeks.

Ako koristite a Jupyter Bilježnica, ne zaboravite dodati %matplotlib inline, inače se graf neće prikazati.

%matplotlib inline
df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack()
df_plot

Iscrtavanje tog nesloženog okvira kao stupčastog dijagrama daje donju sliku.

Grupirani stupčasti grafikon prosječnog kapitalnog dobitka prema dohodovnoj skupini i bračnom statusu

Kako čitati velike CSV datoteke s Pandasima

Skup podataka za odrasle je malen, ali isti poziv može se zaustaviti pri izvozu od više gigabajta. Tri argumenta obavljaju većinu posla.

  • usecols učitava samo stupce koji su vam stvarno potrebni. Dokumentacija za pandas navodi da to rezultira puno bržim parsiranjem i manjom upotrebom memorije.
  • dtype pričvršćuje svaki stupac na tip, tako da Pandas preskače zaključivanje i ne proširuje cijele brojeve na 64 bita prema zadanim postavkama.
  • veličina komada vraća TextFileReader umjesto DataFrame-a, što vam omogućuje petlju kroz blokove od N redaka i agregiranje usput.
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)

Dvije dodatne opcije pomažu nakon što su osnove postavljene. engine='pyarrow' prebacuje se na višenitni Arrow parser i dtype_backend='pyarrow' rezultat čuva u stupcima sa strelicama. low_memory je True prema zadanim postavkama, što interno parsira datoteku u dijelovima, ali može proizvesti miješane tipove u stupcu; postavite eksplicitni dtype umjesto da se oslanjate na njega.

Konačno, compression='infer' znači da se putanja koja završava na .gz, .zip, .bz2, .xz ili .zst dekomprimira u hodu, tako da nema potrebe raspakirati arhivu prije čitanja.

Uobičajene Pandas read_csv() greške i kako ih ispraviti

Većina neuspjeha funkcije read_csv() dolazi iz četiri uzroka, a svaki ima dokumentirani argument koji ga rješava.

greška Izazvati Popraviti
Pogreška datotekeNijePronađena Putanja je relativna u odnosu na radni direktorij, a ne u odnosu na skriptu. Koristite apsolutnu putanju ili potvrdite URL shema je jedna od sljedećih: http, ftp, s3, gs ili datoteka.
UnicodeDecodeError Datoteka nije UTF-8, što je zadano kodiranje. Upišite encoding='latin-1′ ili ispravan kodek ili encoding_errors='replace'.
ParserError: Pogreška prilikom tokenizacije podataka Redak sadrži više polja nego što je navedeno u zaglavlju. Proslijedite on_bad_lines='skip' ili 'warn' ili postavite ispravnu separaciju.
DtypeWarning: stupci imaju miješane tipove Zaključivanje o fragmentiranim tipovima vidjelo je različite tipove u jednom stupcu. Postavite eksplicitni dtype ili low_memory=False.
Stupci pomaknuti za jedan Završni razdjelnik omogućuje Pandasu da promovira prvo polje u indeks. Pass index_col=False.

Skup podataka za odrasle izravno prikazuje slučaj nedostajuće vrijednosti: nepoznati unosi za radnu klasu, zanimanje i native_country pohranjuju se kao doslovni upitnik, pa stižu kao niz '?' osim ako ih ne deklarirate.

# 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)

Pitanja i odgovori

Oba pozivaju isti parser. read_csv() prema zadanim postavkama koristi zarez kao razdjelnik, dok read_table() čita opću datoteku s razdjelnicima i očekuje da sami postavite razdjelnik. Koristite read_csv() za datoteke s zarezima, a read_table() za izvoze odvojene tabulatorima ili okomitim crtama.

Pozovite df.to_csv('output.csv', index=False). Izbrišiteping Indeks izbjegava neimenovani prvi stupac pri sljedećem čitanju. Dodajte argumente sep, encoding ili compression kako biste odražavali postavke koje ste koristili prilikom uvoza datoteke.

Proslijedite parse_dates s nazivima ili pozicijama stupaca i dodajte date_format kada raspored nije ISO 8601, na primjer date_format='%d/%m/%Y'. Bez njega, stupci datuma stižu kao obični objektni nizovi i potreban im je zaseban poziv to_datetime.

Postavite sep na znak, kao što je sep=';' ili sep='\t'. Razdjelnici dulji od jednog znaka tretiraju se kao regularni izrazi i prisiljavaju sporiji Python engine. sep=None omogućuje tom engineu da prepozna razdjelnik iz prvog valjanog retka.

Koristite nrows za ograničavanje broja vraćenih redaka podataka, a skiprows za preskakanje bloka vodećih redaka. Kombiniranjem listajte stranice kroz datoteku, na primjer skiprows=1000000 s nrows=999999 za čitanje drugog milijun redaka.

Da. kompresija je prema zadanim postavkama 'infer', pa se putanja koja završava na .gz, .zip, .bz2, .xz ili .zst automatski dekomprimira. URLKorištenje http, ftp, s3, gs ili file protokola radi, a storage_options prosljeđuje vjerodajnice udaljenom backendu.

Obučeni modeli označavaju vjerojatne pogreške u tipu, grupiraju gotovo duplicirane pravopise kategorija i imputiraju nedostajuće vrijednosti iz okolnih stupaca. To sužava ručno čišćenje na retke koje postavka na_values ​​ili dtype temeljena na pravilima ne može sama riješiti.

Copilot brzo izrađuje predložak čim vidi uzorak datoteke. Tretira popis argumenata kao nacrt jer često pogađa tip datoteke i kodiranje. Prije pokretanja provjerite svaku generiranu ključnu riječ u odnosu na referencu pandas API-ja.

Sažmite ovu objavu uz: