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

