Pandas read_csv() în Python cu Exemplu
⚡ Rezumat inteligent
Funcția Pandas read_csv() transformă un fișier separat prin virgulă, local sau la distanță, într-un DataFrame printr-un singur apel. Această demonstrație importă setul de date UCI pentru recensământul adulților, denumește cele cincisprezece coloane ale acestuia și rezumă rezultatul cu agregări groupby.
Importați CSV în Pandas
În timpul tutorialului TensorFlow, veți utiliza set de date pentru adulți, care este adesea folosit pentru sarcini de clasificare. Fișierul folosit mai jos este fișierul brut adult.data export din Depozitul de învățare automată UCI, iar pagina setului de date oferă și o descărcare în format zip și ucimlrepo pachet dacă calea directă se oprește vreodată din rezolvare.
Datele sunt stocate în format CSV. Setul de date include 8 variabile categorice:
- clasa de lucru
- educaţie
- marital
- ocupație
- relaţie
- rasă
- sex
- tara de origine
Și 6 variabile continue:
- vârstă
- fnlwgt
- educație_num
- câștig de capital
- pierdere_capital
- ore_săptămână
Împreună cu veniturile label coloană, care formează cele 15 nume de coloane pe care le veți transmite ursi panda în secțiunea următoare.
Metoda Pandas read_csv().
Pentru a importa un set de date CSV, puteți utiliza obiectul pd.read_csv(). Semnătura de bază este:
Sintaxa Pandas read_csv().
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- filepath_or_buffercale, URLsau un obiect de tip fișier care conține datele
- sept.=',': delimitatorul de utilizat
- nume=Niciunul: denumiți coloanele. Dacă setul de date are zece coloane, trebuie să transmiteți zece nume
- index_col=Niciuna: ce coloană să fie utilizată ca index de rând. Transmiteți False pentru a forța un index întreg proaspăt
- skipinitialspace=Fals: omite spațiile după delimitator
Pentru lista completă a argumentelor, consultați pagina oficială Documentația pandas.read_csv().
Pandas read_csv() Exemplu
Fragmentul de mai jos denumește toate cele 15 coloane, indică fișierul UCI și elimină spațiul care urmează după fiecare virgulă din acest set de date.
## 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
ieșire:
(32561, 15)
Forma confirmă 32,561 de rânduri și 15 coloane, deci fiecare nume din COLUMNS a fost asociat cu un câmp din fișier.
Parametrii cheie Pandas read_csv()
read_csv() acceptă mai mult de cincizeci de argumente, dar un grup mic acoperă aproape fiecare import real. Valorile implicite de mai jos sunt cele documentate în referința API pandas curentă.
| Parametru | Mod implicit | Ce face |
| sep | '' | Caracter sau expresie regulată utilizată ca delimitator. Folosiți sep=';' sau sep='\t' pentru alte formate. |
| antet | 'deduce' | Numărul rândului care conține etichetele coloanelor. Transmite header=None când fișierul nu are un rând de antet. |
| nume | nu setat | Listă explicită de etichete de coloană. Combinați cu header=0 pentru a înlocui un antet existent. |
| index_col | Nici unul | Coloană de utilizat ca index de rând. index_col=False forțează un index întreg simplu. |
| usecols | Nici unul | Subset de coloane de încărcat, după etichetă sau poziție. Reduce atât timpul de analiză, cât și memoria. |
| dtype | Nici unul | Tipuri de date pe coloană, de exemplu {'age': 'int32'}. Omite inferența de tip. |
| na_values | Nici unul | Șiruri suplimentare de citit ca NaN, cum ar fi substituentul „?” în setul de date pentru adulți. |
| rânduri sărite / rânduri noi | Nici unul | Sari peste primele rânduri sau citește doar primele N rânduri de date. |
| parse_dates | Nici unul | Coloane care vor fi convertite în datetime în timpul citirii, asociate cu date_format. |
| codare | „utf-8” | Codificarea textului fișierului. Folosiți „latin-1” sau „cp1252” pentru exporturile vechi. |
| marimea bucatilor | Nici unul | Returnează un iterator care produce fișierul în blocuri de N rânduri. |
| pe linii_proaste | 'eroare' | Ce se face cu rândurile incorect formate: le ridică, le avertizează sau le omite. |
Două dintre acestea merită menționate. index_col=False nu este același lucru cu a o lăsa nesetată: îi spune explicit Pandas să nu promoveze prima coloană, ceea ce este ceea ce doriți atunci când un fișier termină fiecare linie cu un delimitator rătăcit. Și names suprascrie în tăcere orice declară fișierul, deci treceți header=0 alături de acesta atunci când fișierul CSV conține într-adevăr un rând de antet.
Metoda Pandas groupby().
O modalitate ușoară de a vizualiza datele este utilizarea metodei groupby. Această metodă vă poate ajuta să rezumați datele pe grupe. Mai jos este o listă de agregări disponibile cu metoda groupby():
- numără: numără
- min: min
- max: max
- înseamnă: însemnătate
- mediană: mediană
- abaterea standard: std
- si altii
În cadrul funcției groupby(), denumiți coloana pe care doriți să o grupați înainte de a aplica agregarea.
Să aruncăm o privire la un singur grupping cu setul de date pentru adulți. Veți obține media tuturor variabilelor continue în funcție de tipul de venit, care este peste 50 sau sub 50:
df_train.groupby(['label']).mean()
| etichetă | vârstă | fnlwgt | educație_num | câștig de capital | pierdere_capital | ore_săptămână |
| <= 50K | 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 |
Puteți obține vârsta minimă în funcție de tipul de gospodărie:
df_train.groupby(['label'])['age'].min() label <=50K 17 >50K 19 Name: age, dtype: int64
De asemenea, puteți grupa după mai multe coloane. De exemplu, puteți obține câștigul de capital maxim în funcție de tipul gospodăriei și starea civilă.
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
Puteți crea un grafic după o funcție groupby. O modalitate de a face acest lucru este să reprezentați grafic direct rezultatul grupat.
Pentru a crea un grafic mai clar, aplicați unstack() după mean() astfel încât starea civilă să se mute din index în coloane. Graficul are apoi două grupuri, câte unul pentru fiecare etichetă de venit, în loc de cele paisprezece (2*7) bare pe care le-ar produce un index plat pe mai multe niveluri.
Dacă utilizați a Jupyter Blocnotes, nu uitați să adăugați %matplotlib inline, altfel nu va fi afișat niciun grafic.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
Reprezentarea grafică a cadrului nestivuit sub formă de diagramă cu bare dă figura de mai jos.
Cum să citești fișiere CSV mari cu Pandas
Setul de date pentru adulți este mic, dar același apel se poate bloca la un export de mai mulți gigabytes. Trei argumente fac cea mai mare parte a muncii.
- usecols încarcă doar coloanele de care aveți nevoie. Documentația pandas menționează că acest lucru duce la o analiză mult mai rapidă și la un consum redus de memorie.
- dtype fixează fiecare coloană la un tip, astfel încât Pandas sări peste inferență și nu lărgește numerele întregi la 64 de biți în mod implicit.
- marimea bucatilor returnează un TextFileReader în loc de un DataFrame, permițându-vă să parcurgeți blocuri de N rânduri și să agregați pe parcurs.
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)
Două alte opțiuni sunt utile odată ce elementele de bază sunt stabilite. engine='pyarrow' comută la parserul Arrow cu mai multe fire de execuție și dtype_backend='pyarrow' păstrează rezultatul în coloane cu săgeți. low_memory este True în mod implicit, ceea ce analizează fișierul intern în bucăți, dar poate produce tipuri mixte într-o coloană; setează un dtype explicit în loc să te bazezi pe acesta.
În cele din urmă, compression='infer' înseamnă că o cale care se termină în .gz, .zip, .bz2, .xz sau .zst este decomprimată din mers, deci nu este nevoie să despachetați o arhivă înainte de a o citi.
Erori comune ale funcției read_csv() în Pandas și cum să le remediați
Majoritatea eșecurilor funcției read_csv() provin din patru cauze, iar fiecare are un argument documentat care o rezolvă.
| Eroare | Provoca | Repara |
| FileNotFoundError | Calea este relativă la directorul de lucru, nu la script. | Folosește o cale absolută sau confirmă URL Schema este una dintre http, ftp, s3, gs sau fișier. |
| EroareDecodareUnicode | Fișierul nu este UTF-8, care este codificarea implicită. | Transmiteți encoding='latin-1′ sau codecul corect, sau encoding_errors='replace'. |
| ParserError: Eroare la tokenizarea datelor | Un rând conține mai multe câmpuri decât declară antetul. | Transmite on_bad_lines='skip' sau 'warn' sau setează sep-ul corect. |
| Avertisment Dtype: coloanele au tipuri mixte | Inferența de tip fragmentat a văzut diferite tipuri într-o singură coloană. | Setați un dtype explicit sau low_memory=False. |
| Coloanele au fost deplasate cu o unitate | Un delimitator final face ca Pandas să promoveze primul câmp în index. | Pass index_col=False. |
Setul de date pentru adulți prezintă direct cazul valorii lipsă: intrările necunoscute de clasă de muncă, ocupație și țară_nativă sunt stocate ca un semn de întrebare literal, deci ajung ca șirul de caractere „?”, cu excepția cazului în care le declarați.
# 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)

