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.

  • ๐Ÿ”˜ ร‰n samtale: pd.read_csv() aksepterer en filsti, en URL, eller et hvilket som helst objekt som eksponerer en lesemetode.
  • โ˜‘๏ธ Kolonnekontroll: Gi navn for รฅ merke kolonnene og index_col=False for รฅ beholde en ren heltallsindeks.
  • โœ… Mellomrom: skipinitialspace=True fjerner mellomrommet som fรธlger hvert komma i datasettet for voksne.
  • ๐Ÿงช Gruppe og aggregert: groupby() oppsummerer rammen med antall, min, maks, gjennomsnitt, median eller std.
  • ๐Ÿ› ๏ธ Store filer: usecols, dtype og chunksize reduserer parsetid og minne ved eksport av flere gigabyte.
  • โš ๏ธ Vanlige feil: Koding, dรฅrlige linjer og blandede dtyper har hver et dokumentert argument som fikser dem.

Pandas read_csv() med Eksempel

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.

Gruppert sรธylediagram over gjennomsnittlig kapitalgevinst etter inntektsmerke og sivilstatus

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)

Spรธrsmรฅl og svar

Begge kaller den samme parseren. read_csv() bruker som standard et kommaskilletegn, mens read_table() leser en generell avgrenset fil og forventer at du angir sep selv. Bruk read_csv() for kommafiler og read_table() for tabulator- eller pipe-separerte eksporter.

Kall df.to_csv('output.csv', index=False). Slippping Indeksen unngรฅr en navnlรธs fรธrste kolonne ved neste lesing. Legg til sep-, encoding- eller komprimeringsargumenter for รฅ speile innstillingene du brukte da filen ble importert.

Send parse_dates med kolonnenavnene eller -posisjonene, og legg til date_format nรฅr oppsettet ikke er ISO 8601, for eksempel date_format='%d/%m/%Y'. Uten den ankommer datokolonnene som vanlige objektstrenger og trenger et separat to_datetime-kall.

Sett sep til tegnet, for eksempel sep=';' eller sep='\t'. Skilletegn som er lengre enn ett tegn behandles som regulรฆre uttrykk og tvinger frem det tregere Python engine.sep=None lar den motoren sniffe skilletegnet fra den fรธrste gyldige raden.

Bruk nrows for รฅ begrense antallet returnerte datarader, og skiprows for รฅ hoppe forbi en blokk med innledende linjer. Ved รฅ kombinere dem, blar du gjennom en fil, for eksempel skiprows=1000000 med nrows=999999 for รฅ lese den andre millionen rader.

Ja. Standardinnstillingen for komprimering er ยซinferยป, sรฅ en sti som slutter pรฅ .gz, .zip, .bz2, .xz eller .zst dekomprimeres automatisk. URLs bruker http, ftp, s3, gs eller fil alt arbeid, og storage_options sender pรฅloggingsinformasjon til den eksterne backend.

Trente modeller flagger sannsynlige typefeil, grupperer nesten dupliserte kategoristavinger og imputerer manglende verdier fra de omkringliggende kolonnene. Dette begrenser den manuelle oppryddingen til radene en regelbasert na_values- eller dtype-innstilling ikke kan lรธse pรฅ egenhรฅnd.

Copilot lager raskt et utkast til standardteksten nรฅr den kan se et eksempel pรฅ filen. Behandle argumentlisten som et utkast, fordi den ofte gjetter dtype og koding. Sjekk hvert genererte nรธkkelord mot pandas API-referanse fรธr du kjรธrer den.

Oppsummer dette innlegget med: