Pandaer read_csv() i Python med Eksempel

โšก Smart opsummering

Pandas read_csv() omdanner en kommasepareret fil, lokal eller fjern, til en DataFrame i et enkelt kald. Denne gennemgang importerer UCI-datasรฆttet for voksenfolketรฆllinger, navngiver dets femten kolonner og opsummerer resultatet med groupby-aggregeringer.

  • ๐Ÿ”˜ ร‰t opkald: pd.read_csv() accepterer en filsti, en URL, eller ethvert objekt, der eksponerer en lรฆsemetode.
  • โ˜‘๏ธ Kolonnekontrol: Giv navne for at mรฆrke kolonnerne og index_col=False for at bevare et almindeligt heltalsindeks.
  • โœ… Hvidt rum: skipinitialspace=True fjerner mellemrummet efter hvert komma i datasรฆttet for voksne.
  • ๐Ÿงช Gruppe og aggregeret: groupby() opsummerer rammen med count, min, max, mean, median eller std.
  • ๐Ÿ› ๏ธ Store filer: usecols, dtype og chunksize reducerer parsetid og hukommelse ved eksport af flere gigabyte.
  • โš ๏ธ Almindelige fejl: Kodning, forkerte linjer og blandede dtyper har hver et dokumenteret argument, der retter dem.

Pandas read_csv() med Eksempel

Importer CSV i Pandas

I lรธbet af TensorFlow-vejledningen vil du bruge voksendatasรฆt, som ofte bruges til klassificeringsopgaver. Filen, der bruges nedenfor, er den rรฅ adult.data eksport fra UCI Machine Learning Repository, og datasรฆtsiden tilbyder ogsรฅ en zip-download og ucimlrepo pakke, hvis den direkte sti nogensinde holder op med at lรธses.

Dataene gemmes i CSV-format. Datasรฆttet indeholder 8 kategoriske variabler:

  • arbejdsklasse
  • uddannelse
  • รฆgteskabelig
  • besรฆttelse
  • forhold
  • lรธb
  • kรธn
  • oprindelses land

Og 6 kontinuerlige variabler:

  • alder
  • fnlwgt
  • uddannelsesnummer
  • kapitalgevinst
  • kapitaltab
  • timer_uge

Sammen med indkomsten label kolonne, der danner de 15 kolonnenavne, du vil sende til pandas i nรฆste afsnit.

Pandas read_csv() metode

For at importere et CSV-datasรฆt kan du bruge objektet pd.read_csv(). Den grundlรฆggende signatur er:

Pandas read_csv() Syntaks

pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
  • filsti_eller_buffer: sti, URLeller fillignende objekt, der indeholder dataene
  • sep=',': den afgrรฆnser, der skal bruges
  • navne=IngenNavngiv kolonnerne. Hvis datasรฆttet har ti kolonner, skal du angive ti navne.
  • index_col=Ingen: hvilken kolonne der skal bruges som rรฆkkeindeks. Send False for at fremtvinge et nyt heltalsindeks
  • spring initialspace=Falskspring mellemrum over efter afgrรฆnseren

For den fulde liste over argumenter, se den officielle pandas.read_csv() dokumentation.

Pandas read_csv() Eksempel

Kodestykket nedenfor navngiver alle 15 kolonner, peger pรฅ UCI-filen og fjerner mellemrummet efter hvert komma i dette specifikke datasรฆt.

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

Figuren bekrรฆfter 32,561 rรฆkker og 15 kolonner, sรฅ hvert navn i COLUMNS blev matchet med et felt i filen.

Nรธgleparametre for Pandas read_csv()

read_csv() accepterer mere end halvtreds argumenter, men en lille gruppe dรฆkker nรฆsten alle reelle importer. Standardindstillingerne nedenfor er dem, der er dokumenteret i den aktuelle pandas API-reference.

Parameter Standard Hvad gรธr den
september '' Tegn eller regex bruges som afgrรฆnser. Brug sep=';' eller sep='\t' til andre formater.
header 'udlede' Rรฆkkenummer, der indeholder kolonnenavnene. Send header=None, nรฅr filen ikke har nogen headerrรฆkke.
navne ikke angivet Eksplicit liste over kolonnenavne. Kombinรฉr med header=0 for at erstatte en eksisterende header.
indeks_kolonne Ingen Kolonne, der skal bruges som rรฆkkeindeks. index_col=Falsk gennemtvinger et almindeligt heltalsindeks.
usecols Ingen Delmรฆngde af kolonner, der skal indlรฆses, efter etiket eller position. Reducerer bรฅde parsetid og hukommelse.
dtype Ingen Datatyper pr. kolonne, for eksempel {'age': 'int32'}. Springer typeinferens over.
na_vรฆrdier Ingen Ekstra strenge, der skal lรฆses som NaN, f.eks. pladsholderen '?' i datasรฆttet for voksne.
springrรฆkker / nrรฆkker Ingen Spring over indledende linjer, eller lรฆs kun de fรธrste N datarรฆkker.
parse_dates Ingen Kolonner, der skal konverteres til datetime under lรฆsning, parret med date_format.
kodning 'utf-8' Tekstkodning af filen. Brug 'latin-1' eller 'cp1252' til eksport af รฆldre versioner.
klumpstรธrrelse Ingen Returner en iterator, der giver filen i blokke af N rรฆkker.
pรฅ_dรฅrlige_linjer 'fejl' Hvad skal man gรธre med forkert udformede rรฆkker: hรฆv, advarsel eller spring dem over.

To af disse fortjener en bemรฆrkning. index_col=False er ikke det samme som at lade den vรฆre uindstillet: den fortรฆller eksplicit Pandas ikke at flytte den fรธrste kolonne op, hvilket er det, du รธnsker, nรฅr en fil afslutter hver linje med en tilfรฆldig afgrรฆnser. Og names overskriver lydlรธst det, filen deklarerer, sรฅ send header=0 ved siden af โ€‹โ€‹den, nรฅr CSV-filen rent faktisk indeholder en overskriftsrรฆkke.

Pandas groupby() Metode

En nem mรฅde at se dataene pรฅ er at bruge groupby-metoden. Denne metode kan hjรฆlpe dig med at opsummere dataene efter gruppe. Nedenfor er en liste over aggregeringer, der er tilgรฆngelige med groupby()-metoden:

  • tรฆlle: tรฆlle
  • min: min
  • max: max
  • betyde: betyde
  • median: median
  • standardafvigelse: std
  • og andre

Inde i groupby() navngiver du den kolonne, du vil gruppere pรฅ, fรธr du anvender aggregeringen.

Lad os se pรฅ en enkelt gruppeping med datasรฆttet for voksne. Du fรฅr gennemsnittet af alle de kontinuerlige variabler efter indtรฆgtstype, det vil sige over 50 eller under 50:

df_train.groupby(['label']).mean()
label alder fnlwgt uddannelsesnummer kapitalgevinst kapitaltab timer_uge
<=50 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 efter husstandstype:

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

Du kan ogsรฅ gruppere efter flere kolonner. For eksempel kan du fรฅ den maksimale kapitalgevinst i henhold til husstandstype og civilstand.

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 oprette et plot efter en gruppering. En mรฅde at gรธre det pรฅ er at plotte det grupperede resultat direkte.

For at skabe et tydeligere plot, skal du anvende unstack() efter mean(), sรฅ civilstanden flyttes fra indekset til kolonnerne. Diagrammet har derefter to grupper, รฉn pr. indkomstetiket, i stedet for de fjorten (2*7) sรธjler, som et fladt flerniveauindeks ville producere.

Hvis du bruger en Jupyter NotesbogHusk at tilfรธje %matplotlib inline, ellers vises der ikke noget plot.

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

Hvis man plotter den ustablede ramme som et sรธjlediagram, fรฅr man figuren nedenfor.

Grupperet sรธjlediagram over gennemsnitlig kapitalgevinst efter indkomstmรฆrke og civilstand

Sรฅdan lรฆser du store CSV-filer med Pandas

Datasรฆttet for voksne er lille, men det samme kald kan gรฅ i stรฅ ved en eksport pรฅ flere gigabyte. Tre argumenter gรธr det meste af arbejdet.

  • usecols indlรฆser kun de kolonner, du rent faktisk har brug for. Pandas-dokumentationen bemรฆrker, at dette resulterer i meget hurtigere parsing og lavere hukommelsesforbrug.
  • dtype fastgรธr hver kolonne til en type, sรฅ Pandas springer inferens over og ikke udvider heltal til 64-bit som standard.
  • klumpstรธrrelse returnerer en TextFileReader i stedet for en DataFrame, sรฅ du kan gennemgรฅ blokke af N rรฆkker og aggregere undervejs.
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 yderligere muligheder hjรฆlper, nรฅr det grundlรฆggende er pรฅ plads. engine='pyarrow' skifter til den multitrรฅdete Arrow-parser, og dtype_backend='pyarrow' gemmer resultatet i kolonner med pilebaggrund. low_memory er som standard True, hvilket analyserer filen internt i stykker, men den kan producere blandede typer i en kolonne; angiv en eksplicit dtype i stedet for at stole pรฅ den.

Endelig compression='infer' betyder, at en sti, der ender pรฅ .gz, .zip, .bz2, .xz eller .zst, dekomprimeres undervejs, sรฅ der er ingen grund til at udpakke et arkiv, fรธr det lรฆses.

Almindelige Pandas read_csv()-fejl og hvordan man retter dem

De fleste read_csv()-fejl skyldes fire รฅrsager, og hver af dem har et dokumenteret argument, der lรธser problemet.

Fejl ร…rsag Fix
FileNotFoundError Stien er relativ i forhold til arbejdsmappen, ikke i forhold til scriptet. Brug en absolut sti, eller bekrรฆft URL Skemaet er et af http, ftp, s3, gs eller file.
UnicodeDecodeError Filen er ikke UTF-8, som er standardkodningen. Send encoding='latin-1โ€ฒ eller den korrekte codec, eller encoding_errors='replace'.
ParserError: Fejl ved tokenisering af data En rรฆkke indeholder flere felter, end headeren angiver. Giv on_bad_lines='skip' eller 'warn' videre, eller indstil den korrekte sep.
DtypeWarning: Kolonner har blandede typer Chunked type inferens sรฅ forskellige typer i รฉn kolonne. Angiv en eksplicit dtype, eller low_memory=False.
Kolonner forskudt med รฉn En efterfรธlgende afgrรฆnser fรฅr Pandas til at forfremme det fรธrste felt til indekset. Send index_col=Falsk.

Datasรฆttet for voksne viser tilfรฆldet med manglende vรฆrdi direkte: ukendte poster for arbejdsklasse, erhverv og native_country gemmes som et bogstaveligt spรธrgsmรฅlstegn, sรฅ de ankommer som strengen '?', medmindre 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)

Ofte Stillede Spรธrgsmรฅl

Begge kalder den samme parser. read_csv() bruger som standard et kommaseparatortegn, mens read_table() lรฆser en generel afgrรฆnset fil og forventer, at du selv indstiller sep. Brug read_csv() til kommafiler og read_table() til tabulator- eller pipeseparerede eksporter.

Kald df.to_csv('output.csv', index=False). Dropping Indekset undgรฅr en unavngiven fรธrste kolonne ved nรฆste lรฆsning. Tilfรธj sep-, encoding- eller compression-argumenter for at afspejle de indstillinger, du brugte, da filen blev importeret.

Send parse_dates med kolonnenavnene eller -positionerne, og tilfรธj date_format, nรฅr layoutet ikke er ISO 8601, for eksempel date_format='%d/%m/%Y'. Uden det ankommer datokolonner som almindelige objektstrenge og krรฆver et separat to_datetime-kald.

Sรฆt sep til tegnet, f.eks. sep=';' eller sep='\t'. Separatorer, der er lรฆngere end รฉt tegn, behandles som regulรฆre udtryk og tvinger det langsommere Python engine.sep=None lader den pรฅgรฆldende motor snuse afgrรฆnsertegnet fra den fรธrste gyldige rรฆkke.

Brug nrows til at begrรฆnse antallet af returnerede datarรฆkker, og skiprows til at springe forbi en blok af indledende linjer. Kombinรฉr dem for at bladre gennem en fil, for eksempel skiprows=1000000 med nrows=999999 for at lรฆse den anden million rรฆkker.

Ja. Komprimering er som standard indstillet til 'infer', sรฅ en sti, der ender pรฅ .gz, .zip, .bz2, .xz eller .zst, dekomprimeres automatisk. URLs bruger http, ftp, s3, gs eller file alt arbejde, og storage_options sender legitimationsoplysninger til den eksterne backend.

Trรฆnede modeller markerer sandsynlige typefejl, grupperer nรฆsten dublerede kategoristavninger og importerer manglende vรฆrdier fra de omgivende kolonner. Det indsnรฆvrer den manuelle oprydning til de rรฆkker, som en regelbaseret na_values- eller dtype-indstilling ikke selv kan lรธse.

Copilot laver hurtigt et udkast til standardteksten, nรฅr den kan se en prรธve af filen. Behandl argumentlisten som et udkast, fordi den ofte gรฆtter dtype og kodning. Tjek hvert genererede nรธgleord mod pandas API-referencen, fรธr den kรธres.

Opsummer dette indlรฆg med: