Pandas read_csv() in Python met Voorbeeld

⚡ Slimme samenvatting

Pandas read_csv() zet een door komma's gescheiden bestand, lokaal of op afstand, in één keer om in een DataFrame. Deze handleiding importeert de UCI-dataset met gegevens over de volwassenheidsbevolking, geeft de vijftien kolommen een naam en vat het resultaat samen met behulp van groupby-aggregaties.

  • 🔘 Eén telefoontje: pd.read_csv() accepteert een bestandspad, een URL, of elk object dat een leesmethode beschikbaar stelt.
  • ☑️ Kolombesturing: Geef namen op om de kolommen te labelen en stel index_col=False in om een ​​gewone integer-index te behouden.
  • Witte ruimte: skipinitialspace=True verwijdert de spatie die na elke komma in de dataset met volwassen gegevens staat.
  • 🧪 Groeperen en aggregeren: groupby() vat het frame samen met het aantal, minimum, maximum, gemiddelde, mediaan of standaardafwijking.
  • Grote bestanden: usecols, dtype en chunksize verminderen de parseertijd en het geheugenverbruik bij exports van meerdere gigabytes.
  • ⚠️ Veel voorkomende fouten: Codering, ongeldige regels en gemengde gegevenstypen hebben elk een gedocumenteerd argument dat ze corrigeert.

Panda's read_csv() met voorbeeld

Importeer CSV in Panda's

Tijdens de TensorFlow-tutorial gebruik je de dataset van volwassenen, wat vaak wordt gebruikt voor classificatietaken. Het onderstaande bestand is het onbewerkte bestand. adult.data De dataset is geëxporteerd vanuit de UCI Machine Learning Repository, en op de datasetpagina is ook een gecomprimeerde download beschikbaar. ucimlrepo pakket voor het geval het directe pad ooit niet meer wordt opgelost.

De gegevens zijn opgeslagen in CSV-formaat. De dataset bevat 8 categorische variabelen:

  • werkklas
  • onderwijs
  • huwelijks-
  • bezetting
  • relatie
  • race
  • geslacht
  • geboorteland

En 6 continue variabelen:

  • leeftijd
  • fnlwgt
  • onderwijs_num
  • kapitaal_winst
  • kapitaal_verlies
  • uren_week

Samen met het inkomen label kolom, dat zijn de 15 kolomnamen die je doorgeeft aan Pandas in de volgende sectie.

Panda's read_csv() Methode

Om een ​​CSV-dataset te importeren, kunt u het object pd.read_csv() gebruiken. De basisfunctionaliteit is als volgt:

Panda's read_csv() Syntaxis

pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
  • bestandspad_of_buffer: pad, URL, of een bestandachtig object dat de gegevens bevat
  • sep=',': het scheidingsteken dat gebruikt moet worden
  • namen=Geen: Geef de kolommen een naam. Als de dataset tien kolommen heeft, moet u tien namen opgeven.
  • index_col=Geen: welke kolom moet worden gebruikt als rij-index. Geef False door om een ​​nieuwe integer-index af te dwingen.
  • skipinitialspace=False: sla spaties na het scheidingsteken over

Voor een volledige lijst met argumenten, raadpleeg de officiële website. documentatie van pandas.read_csv().

Panda's read_csv() Voorbeeld

Het onderstaande codefragment benoemt alle 15 kolommen, verwijst naar het UCI-bestand en verwijdert de spatie na elke komma in deze specifieke dataset.

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

Output:

(32561, 15)

De vorm bevestigt 32,561 rijen en 15 kolommen, dus elke naam in COLUMNS kwam overeen met een veld in het bestand.

Belangrijkste parameters van de Pandas read_csv() functie

`read_csv()` accepteert meer dan vijftig argumenten, maar een kleine groep dekt vrijwel alle gangbare imports. De onderstaande standaardwaarden zijn de waarden die gedocumenteerd staan ​​in de huidige pandas API-referentie.

Parameter Standaard Wat het doet
september '' Teken of reguliere expressie gebruikt als scheidingsteken. Gebruik sep=';' of sep='\t' voor andere formaten.
hoofd 'afleiden' Het rijnummer bevat de kolomlabels. Geef header=None door als het bestand geen kopregel heeft.
namen niet ingesteld Een expliciete lijst met kolomlabels. Combineer met header=0 om een ​​bestaande koptekst te vervangen.
index_col Geen De kolom die als rij-index moet worden gebruikt. `index_col=False` dwingt een gewone integer-index af.
usecols Geen Selecteer een subset van kolommen die geladen moeten worden, op basis van label of positie. Dit bespaart zowel parseertijd als geheugen.
dtype Geen Gegevenstypen per kolom, bijvoorbeeld {'age': 'int32'}. Type-inferentie wordt overgeslagen.
na_waarden Geen Extra tekenreeksen die als NaN moeten worden gelezen, zoals de placeholder '?' in de dataset voor volwassenen.
skiprows / nrows Geen Sla de eerste regels over, of lees alleen de eerste N gegevensregels.
parse_dates Geen Kolommen die tijdens het lezen naar datum en tijd moeten worden geconverteerd, in combinatie met de datumindeling.
codering 'utf-8' Tekstcodering van het bestand. Gebruik 'latin-1' of 'cp1252' voor oudere exportmethoden.
formaat van een blokje Geen Retourneer een iterator die het bestand in blokken van N rijen oplevert.
on_bad_lines 'fout' Wat te doen met onregelmatig gevormde rijen: omhoog zetten, waarschuwen of overslaan.

Twee daarvan verdienen een aparte vermelding. index_col=False Dit is niet hetzelfde als het niet instellen: het geeft Pandas expliciet de opdracht om de eerste kolom niet te promoten, wat je wilt als een bestand elke regel eindigt met een losstaand scheidingsteken. names overschrijft stilzwijgend alles wat in het bestand staat, dus geef het door header=0 ernaast, wanneer het CSV-bestand daadwerkelijk een kopregel bevat.

Panda's groupby() Methode

Een eenvoudige manier om de gegevens te bekijken is door de `groupby`-methode te gebruiken. Deze methode kan u helpen de gegevens per groep samen te vatten. Hieronder vindt u een lijst met aggregaties die beschikbaar zijn met de `groupby()`-methode:

  • tellen: tellen
  • min: min
  • maximaal: maximaal
  • bedoel: gemeen
  • mediaan: mediaan
  • standaarddeviatie: std
  • en anderen

Binnen de functie groupby() geef je de kolom op waarop je wilt groeperen, voordat je de aggregatie toepast.

Laten we eens naar een enkele groep kijken.ping Met de dataset van volwassenen. Je krijgt het gemiddelde van alle continue variabelen per type omzet, namelijk boven de 50 of onder de 50:

df_train.groupby(['label']).mean()
label leeftijd fnlwgt onderwijs_num kapitaal_winst kapitaal_verlies uren_week
<= 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

Je kunt de minimumleeftijd per huishoudtype achterhalen:

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

U kunt ook groeperen op meerdere kolommen. U kunt bijvoorbeeld de maximale vermogenswinst krijgen op basis van het type huishouden en de burgerlijke staat.

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

Je kunt na een groepering een grafiek maken. Een manier om dit te doen is door het gegroepeerde resultaat direct weer te geven.

Om een ​​overzichtelijker diagram te maken, pas je unstack() toe na mean(), zodat de burgerlijke staat van de index naar de kolommen verschuift. Het diagram heeft dan twee groepen, één per inkomenscategorie, in plaats van de veertien (2*7) balken die een vlakke multilevel-index zou opleveren.

Als u een gebruikt Jupyter NotitieboekVergeet niet om %matplotlib inline toe te voegen, anders wordt er geen grafiek weergegeven.

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

Als je dat ongestapelde frame als een staafdiagram weergeeft, krijg je de onderstaande afbeelding.

Gegroepeerd staafdiagram van de gemiddelde vermogenswinst per inkomenscategorie en burgerlijke staat.

Hoe grote CSV-bestanden te lezen met Pandas

De dataset met gegevens van volwassenen is klein, maar dezelfde aanroep kan vastlopen bij een export van meerdere gigabytes. Drie argumenten volstaan ​​voor het grootste deel van het werk.

  • usecols Laadt alleen de kolommen die je daadwerkelijk nodig hebt. De pandas-documentatie vermeldt dat dit resulteert in veel snellere verwerking en een lager geheugenverbruik.
  • dtype Hierdoor wordt elke kolom aan een type gekoppeld, waardoor Pandas de type-inferentie overslaat en gehele getallen niet standaard naar 64-bits uitbreidt.
  • formaat van een blokje Deze functie retourneert een TextFileReader in plaats van een DataFrame, waardoor je door blokken van N rijen kunt itereren en gaandeweg kunt aggregeren.
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)

Zodra de basis op orde is, bieden nog twee extra opties uitkomst. engine='pyarrow' schakelt over naar de multithreaded Arrow-parser, en dtype_backend='pyarrow' Houdt het resultaat bij in kolommen met een pijl als rug. low_memory is standaard True, waardoor het bestand intern in delen wordt geparseerd, maar dit kan leiden tot gemengde gegevenstypen in een kolom; stel een expliciet gegevenstype in in plaats van hierop te vertrouwen.

Tenslotte compression='infer' Dit betekent dat een pad dat eindigt op .gz, .zip, .bz2, .xz of .zst direct wordt uitgepakt, waardoor het niet nodig is om een ​​archief uit te pakken voordat het kan worden gelezen.

Veelvoorkomende fouten bij het gebruik van `read_csv()` in Pandas en hoe je ze kunt oplossen

De meeste fouten bij het uitvoeren van `read_csv()` hebben vier oorzaken, en voor elk daarvan is een gedocumenteerd argument beschikbaar dat het probleem oplost.

Fout Veroorzaken Bepalen
FileNotFoundFout Het pad is relatief ten opzichte van de werkmap, niet ten opzichte van het script. Gebruik een absoluut pad, of bevestig de URL Het schema is een van de volgende: http, ftp, s3, gs of bestand.
UnicodeDecodeError Het bestand is niet in UTF-8-formaat, wat de standaardcodering is. Geef encoding='latin-1' of de juiste codec door, of encoding_errors='replace'.
ParserError: Fout bij het tokeniseren van gegevens Een rij bevat meer velden dan in de koptekst is aangegeven. Geef on_bad_lines='skip' of 'warn' door, of stel de juiste sep in.
DtypeWarning: kolommen bevatten gemengde gegevenstypen Bij de type-inferentie met chunking werden verschillende typen in één kolom weergegeven. Stel een expliciet gegevenstype in, of low_memory=False.
Kolommen één positie verschoven Een afsluitend scheidingsteken zorgt ervoor dat Pandas het eerste veld als index gebruikt. Geef index_col=False door.

De dataset voor volwassenen laat het geval van ontbrekende waarden direct zien: onbekende werkklasse, beroep en geboorteland worden opgeslagen als een letterlijk vraagteken, dus ze komen binnen als de tekenreeks '?' tenzij je ze declareert.

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

Veelgestelde vragen

Beide functies roepen dezelfde parser aan. `read_csv()` gebruikt standaard een komma als scheidingsteken, terwijl `read_table()` een algemeen gescheiden bestand leest en verwacht dat je zelf `sep` instelt. Gebruik `read_csv()` voor bestanden met komma's als scheidingsteken en `read_table()` voor bestanden met tab- of pipe-scheidingstekens.

Roep df.to_csv('output.csv', index=False) aan. Verwijderping De index voorkomt dat de eerste kolom bij de volgende leesbewerking geen naam heeft. Voeg argumenten voor sep, encoding of compression toe die overeenkomen met de instellingen die u gebruikte toen het bestand werd geïmporteerd.

Geef de kolomnamen of -posities door aan parse_dates en voeg date_format toe als de lay-out niet ISO 8601 is, bijvoorbeeld date_format='%d/%m/%Y'. Zonder dit worden datumkolommen als gewone objectstrings aangeleverd en is een aparte to_datetime-aanroep nodig.

Stel sep in op het teken, bijvoorbeeld sep=';' of sep='\t'. Scheidingstekens die langer zijn dan één teken worden behandeld als reguliere expressies en dwingen de tragere methode af. Python engine.sep=None zorgt ervoor dat de engine het scheidingsteken uit de eerste geldige rij kan halen.

Gebruik nrows om het aantal geretourneerde rijen te beperken en skiprows om een ​​blok met beginregels over te slaan. Door ze te combineren blader je bijvoorbeeld door een bestand, bijvoorbeeld skiprows=1000000 met nrows=999999 om de tweede miljoen rijen te lezen.

Ja. De compressiemethode is standaard ingesteld op 'infer', dus een pad dat eindigt op .gz, .zip, .bz2, .xz of .zst wordt automatisch gedecomprimeerd. URLHet gebruik van http, ftp, s3, gs of een bestand werkt allemaal, en storage_options geeft de inloggegevens door aan de externe backend.

Getrainde modellen signaleren waarschijnlijke typefouten, groeperen bijna identieke categorienamen en vullen ontbrekende waarden aan met behulp van de omliggende kolommen. Hierdoor wordt de handmatige correctie beperkt tot de rijen die een op regels gebaseerde `na_values` of `dtype` instelling niet zelfstandig kan oplossen.

Copilot genereert snel de standaardcode zodra het een voorbeeld van het bestand kan zien. Beschouw de argumentenlijst als een concept, omdat het vaak het gegevenstype en de codering raadt. Controleer elk gegenereerd trefwoord aan de hand van de API-referentie van pandas voordat u het uitvoert.

Vat dit bericht samen met: