Pandaer read_csv() i Python med eksempel
โก Smart oppsummering
Pandas read_csv() gjรธr om en kommaseparert fil, lokal eller ekstern, til en DataFrame i ett enkelt kall. Denne gjennomgangen importerer UCI-datasettet for voksenfolketellinger, navngir de femten kolonnene og oppsummerer resultatet med grupperingsaggregeringer.
Importer CSV i Pandas
I lรธpet av TensorFlow-opplรฆringen vil du bruke datasett for voksne, som ofte brukes til klassifiseringsoppgaver. Filen som brukes nedenfor er rรฅfilen adult.data eksport fra UCI Machine Learning Repository, og datasettsiden tilbyr ogsรฅ en zippet nedlasting og ucimlrepo pakke hvis den direkte banen noen gang slutter รฅ lรธses.
Dataene lagres i CSV-format. Datasettet inneholder 8 kategoriske variabler:
- arbeidsklasse
- utdanning
- ekteskapelig
- okkupasjon
- forholdet
- rase
- kjรธnn
- native_country
Og 6 kontinuerlige variabler:
- alder
- fnlwgt
- utdanning_nummer
- kapitalgevinst
- kapitaltap
- timer_uke
Sammen med inntekten label kolonne, som danner de 15 kolonnenavnene du sender til pandaer i neste avsnitt.
Pandas read_csv() Metode
For รฅ importere et CSV-datasett kan du bruke objektet pd.read_csv(). Den grunnleggende signaturen er:
Pandas read_csv() Syntaks
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- filbane_eller_buffer: sti, URL, eller fillignende objekt som inneholder dataene
- sep=',': skilletegnet som skal brukes
- navn=Ingen: navngi kolonnene. Hvis datasettet har ti kolonner, mรฅ du oppgi ti navn
- index_col=Ingen: hvilken kolonne som skal brukes som radindeks. Send False for รฅ tvinge frem en ny heltallsindeks
- skipinitialspace=Falsk: hopp over mellomrom etter skilletegnet
For den fullstendige listen over argumenter, sjekk den offisielle pandas.read_csv()-dokumentasjon.
Pandas read_csv() Eksempel
Kodestykket nedenfor navngir alle 15 kolonnene, peker pรฅ UCI-filen og fjerner mellomrommet som fรธlger hvert komma i dette bestemte datasettet.
## 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
Utgang:
(32561, 15)
Figuren bekrefter 32 561 rader og 15 kolonner, sรฅ hvert navn i COLUMNS ble matchet med et felt i filen.
Nรธkkelparametere for Pandas read_csv()
read_csv() godtar mer enn femti argumenter, men en liten gruppe dekker nesten alle reelle importer. Standardverdiene nedenfor er de som er dokumentert i den nรฅvรฆrende pandas API-referansen.
| Parameter | Misligholde | Hva det gjรธr |
| september | '' | Tegn eller regex brukes som skilletegn. Bruk sep=';' eller sep='\t' for andre formater. |
| header | utlede | Radnummer som inneholder kolonneetikettene. Send header=None nรฅr filen ikke har noen headerrad. |
| navn | ikke satt | Eksplisitt liste over kolonneetiketter. Kombiner med header=0 for รฅ erstatte en eksisterende header. |
| indeks_kolonne | none | Kolonne som skal brukes som radindeks. index_col=Usann tvinger frem en ren heltallsindeks. |
| usecols | none | Delsett av kolonner som skal lastes inn, etter etikett eller posisjon. Reduserer bรฅde analysetid og minne. |
| dtype | none | Datatyper per kolonne, for eksempel {'age': 'int32'}. Hopper over typeinferens. |
| na_verdier | none | Ekstra strenger som skal leses som NaN, for eksempel plassholderen '?' i datasettet for voksne. |
| skiprows / nrows | none | Hopp over innledende linjer, eller les bare de fรธrste N dataradene. |
| parse_dates | none | Kolonner som skal konverteres til datetime under lesing, parret med date_format. |
| koding | 'utf-8' | Tekstkoding av filen. Bruk ยซlatin-1ยป eller ยซcp1252ยป for eksport av eldre versjoner. |
| bitstรธrrelse | none | Returner en iterator som gir filen i blokker pรฅ N rader. |
| pรฅ_dรฅrlige_linjer | 'feil' | Hva du skal gjรธre med feilformede rader: hev, advarsel eller hopp over dem. |
To av disse fortjener en merknad. index_col=False er ikke det samme som รฅ la den vรฆre udefinert: den forteller eksplisitt at Pandas ikke skal forfremme den fรธrste kolonnen, som er det du รธnsker nรฅr en fil avslutter hver linje med et tilfeldig skilletegn. Og names overskriver stille det filen deklarerer, sรฅ send header=0 ved siden av den nรฅr CSV-filen faktisk har en overskriftsrad.
Pandas groupby() Metode
En enkel mรฅte รฅ se dataene pรฅ er รฅ bruke groupby-metoden. Denne metoden kan hjelpe deg med รฅ oppsummere dataene etter gruppe. Nedenfor er en liste over aggregeringer som er tilgjengelige med groupby()-metoden:
- telle: telle
- min: min
- maks: maks
- mener: mener
- median: median
- standardavvik: std
- og andre
Inne i groupby() navngir du kolonnen du vil gruppere pรฅ fรธr du bruker aggregeringen.
La oss ta en titt pรฅ en enkelt gruppeping med datasettet for voksne. Du fรฅr gjennomsnittet av alle de kontinuerlige variablene etter inntektstype, det vil si over 50 000 eller under 50 000:
df_train.groupby(['label']).mean()
| etikett | alder | fnlwgt | utdanning_nummer | kapitalgevinst | kapitaltap | timer_uke |
| <= 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 |
Du kan fรฅ minimumsalderen etter husholdningstype:
df_train.groupby(['label'])['age'].min() label <=50K 17 >50K 19 Name: age, dtype: int64
Du kan ogsรฅ gruppere etter flere kolonner. For eksempel kan du fรฅ maksimal kapitalgevinst i henhold til husholdningstype og sivilstand.
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
Du kan lage et plott etter en gruppering. En mรฅte รฅ gjรธre det pรฅ er รฅ plotte det grupperte resultatet direkte.
For รฅ lage et tydeligere plott, bruk unstack() etter mean() slik at sivilstatusen flyttes fra indeksen til kolonnene. Diagrammet har da to grupper, รฉn per inntektsetikett, i stedet for de fjorten (2*7) sรธylene en flat flernivรฅindeks ville produsert.
Hvis du bruker en Jupyter bรฆrbare, husk รฅ legge til %matplotlib innebygd, ellers vil det ikke vises noe plott.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
ร plotte den udakkede rammen som et stolpediagram gir figuren nedenfor.
Slik leser du store CSV-filer med Pandas
Datasettet for voksne er lite, men det samme kallet kan stoppe opp ved en eksport pรฅ flere gigabyte. Tre argumenter gjรธr mesteparten av arbeidet.
- usecols laster bare kolonnene du faktisk trenger. Pandas-dokumentasjonen bemerker at dette resulterer i mye raskere parsing og lavere minnebruk.
- dtype fester hver kolonne til en type, slik at Pandas hopper over inferens og ikke utvider heltall til 64-bit som standard.
- bitstรธrrelse returnerer en TextFileReader i stedet for en DataFrame, slik at du kan gรฅ over blokker med N rader i lรธkke og aggregere underveis.
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)
To ytterligere alternativer hjelper nรฅr det grunnleggende er pรฅ plass. engine='pyarrow' bytter til den flertrรฅdete Arrow-parseren, og dtype_backend='pyarrow' beholder resultatet i pilstรธttede kolonner. low_memory er True som standard, noe som analyserer filen internt i deler, men den kan produsere blandede typer i en kolonne; angi en eksplisitt dtype i stedet for รฅ stole pรฅ den.
Endelig, compression='infer' betyr at en sti som slutter pรฅ .gz, .zip, .bz2, .xz eller .zst dekomprimeres underveis, slik at det ikke er nรธdvendig รฅ pakke ut et arkiv fรธr det leses.
Vanlige read_csv()-feil i Pandas og hvordan du fikser dem
De fleste read_csv()-feilene kommer av fire รฅrsaker, og hver av dem har et dokumentert argument som lรธser problemet.
| Feil | ร rsak | Fix |
| FilIkkeFunnetFeil | Stien er relativ til arbeidskatalogen, ikke til skriptet. | Bruk en absolutt sti, eller bekreft URL Skjemaet er ett av http, ftp, s3, gs eller file. |
| UnicodeDecodeError | Filen er ikke UTF-8, som er standardkodingen. | Send encoding='latin-1โฒ eller riktig kodek, eller encoding_errors='replace'. |
| ParserError: Feil ved tokenisering av data | En rad har flere felt enn overskriften angir. | Pass on_bad_lines='skip' eller 'warn', eller angi riktig sep. |
| DtypeWarning: kolonner har blandede typer | Chunked type-inferens sรฅ forskjellige typer i รฉn kolonne. | Angi en eksplisitt dtype, eller low_memory=False. |
| Kolonner forskjรธvet med รฉn | Et etterfรธlgende skilletegn gjรธr at Pandas forfremmer det fรธrste feltet til indeksen. | Send index_col=Usann. |
Datasettet for voksne viser tilfellet med manglende verdi direkte: ukjente oppfรธringer for arbeidsklasse, yrke og native_country lagres som et bokstavelig spรธrsmรฅlstegn, sรฅ de ankommer som strengen '?' med mindre du deklarerer dem.
# 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)

