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.

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

