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.

  • 🔘 Un apel: pd.read_csv() acceptă o cale de fișier, un URLsau orice obiect care expune o metodă de citire.
  • ☑️ Controlul coloanei: Transmiteți nume pentru a eticheta coloanele și index_col=False pentru a păstra un index întreg simplu.
  • Spatiu alb: skipinitialspace=Adevărat elimină spațiul care urmează după fiecare virgulă din setul de date pentru adulți.
  • 🧪 Grupează și agregă: groupby() rezumă cadrul cu număr, min, max, medie, mediană sau std.
  • 🛠️ Fișiere mari: usecols, dtype și chunksize reduc timpul de analiză și memoria la exporturile de mai mulți gigaocteți.
  • ⚠️ Erori frecvente: Codificarea, liniile defecte și tipurile de date mixte au fiecare un argument documentat care le remediază.

Pandas read_csv() cu Exemplu

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.

Diagramă cu bare grupată a câștigului mediu de capital în funcție de eticheta de venit și starea civilă

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)

Întrebări frecvente

Ambele apelează același parser. read_csv() folosește implicit un delimitator cu virgulă, în timp ce read_table() citește un fișier delimitat general și se așteaptă să setați singur sep. Folosiți read_csv() pentru fișiere cu virgulă și read_table() pentru exporturi separate prin tabulatori sau bare verticale.

Apelați df.to_csv('output.csv', index=False). Eliminațiping Indexul evită o primă coloană fără nume la următoarea citire. Adăugați argumente sep, encoding sau compression pentru a reflecta setările utilizate la importarea fișierului.

Transmiteți parse_dates cu numele sau pozițiile coloanelor și adăugați date_format atunci când aspectul nu este ISO 8601, de exemplu date_format='%d/%m/%Y'. Fără aceasta, coloanele cu dată ajung ca șiruri de obiecte simple și necesită un apel separat to_datetime.

Setați sep la caracterul, cum ar fi sep=';' sau sep='\t'. Separatorii mai lungi de un caracter sunt tratați ca expresii regulate și forțează modul mai lent de separare. Python engine. sep=None permite motorului respectiv să detecteze delimitatorul de la primul rând valid.

Folosește nrows pentru a limita numărul de rânduri de date returnate și skiprows pentru a sări peste un bloc de linii principale. Combinându-le, parcurge paginile dintr-un fișier, de exemplu skiprows=1000000 cu nrows=999999 pentru a citi al doilea milion de rânduri.

Da. Compresia este setată implicit pe „infer”, deci o cale care se termină în .gz, .zip, .bz2, .xz sau .zst este decomprimată automat. URLs folosind http, ftp, s3, gs sau fișiere funcționează, iar storage_options transmite acreditările către backend-ul la distanță.

Modelele antrenate semnalează erorile probabile de tip, clusterizează ortografiile categoriilor aproape duplicate și impută valori lipsă din coloanele înconjurătoare. Acest lucru restrânge curățarea manuală la rândurile pe care o setare na_values ​​sau dtype bazată pe reguli nu le poate rezolva singură.

Copilot schițează rapid versiunea standard odată ce poate vedea o mostră a fișierului. Tratați lista de argumente ca pe o schiță, deoarece adesea ghicește dtype și encoding. Verificați fiecare cuvânt cheie generat în raport cu referința API pandas înainte de a o rula.

Rezumați această postare cu: