Pandor read_csv() i Python med exempel

โšก Smart sammanfattning

Pandas read_csv() omvandlar en kommaseparerad fil, lokal eller fjรคrransluten, till en DataFrame i ett enda anrop. Denna genomgรฅng importerar UCI:s vuxenfolkrรคkningsdataset, namnger dess femton kolumner och sammanfattar resultatet med groupby-aggregeringar.

  • ๐Ÿ”˜ Ett samtal: pd.read_csv() accepterar en filsรถkvรคg, en URL, eller nรฅgot objekt som exponerar en lรคsmetod.
  • โ˜‘๏ธ Kolumnkontroll: Skicka namn fรถr att mรคrka kolumnerna och index_col=False fรถr att behรฅlla ett vanligt heltalsindex.
  • โœ… Whitespace: skipinitialspace=True tar bort mellanslaget som fรถljer varje komma i vuxendatasetet.
  • ๐Ÿงช Grupp och aggregerad: groupby() sammanfattar bildrutan med count, min, max, mean, median eller std.
  • ๐Ÿ› ๏ธ Stora filer: usecols, dtype och chunksize minskar parsningstid och minne vid export av flera gigabyte.
  • โš ๏ธ Vanliga fel: Kodning, felaktiga rader och blandade dtyper har alla ett dokumenterat argument som รฅtgรคrdar dem.

Pandas read_csv() med Exempel

Importera CSV i Pandas

Under TensorFlow-handledningen kommer du att anvรคnda vuxendataset, som ofta anvรคnds fรถr klassificeringsuppgifter. Filen som anvรคnds nedan รคr rรฅfilen adult.data exportera frรฅn UCI Machine Learning Repository, och datasetsidan erbjuder รคven en zippad nedladdning och ucimlrepo paket om den direkta vรคgen nรฅgonsin slutar upplรถsas.

Data lagras i CSV-format. Datasetet innehรฅller 8 kategoriska variabler:

  • arbetsklass
  • utbildning
  • รคktenskaplig
  • ockupation
  • relation
  • lopp
  • kรถn
  • hemland

Och 6 kontinuerliga variabler:

  • รฅlder
  • fnlwgt
  • utbildningsnummer
  • kapitalvinsten
  • kapitalfรถrlust
  • timmar_vecka

Tillsammans med inkomsten label kolumn, som utgรถr de 15 kolumnnamnen du skickar till pandas i nรคsta avsnitt.

Pandas read_csv() Metod

Fรถr att importera en CSV-datauppsรคttning kan du anvรคnda objektet pd.read_csv(). Grundsignaturen รคr:

Pandas read_csv() Syntax

pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
  • filsรถkvรคg_eller_buffert: stig, URL, eller filliknande objekt som innehรฅller data
  • sep=',': avgrรคnsaren som ska anvรคndas
  • namn=Inga: namnge kolumnerna. Om datamรคngden har tio kolumner mรฅste du ange tio namn
  • index_col=Ingen: vilken kolumn som ska anvรคndas som radindex. Skicka False fรถr att tvinga fram ett nytt heltalsindex
  • hoppa รถver initialutrymme=Falskthoppa รถver mellanslag efter avgrรคnsaren

Fรถr den fullstรคndiga listan รถver argument, se den officiella pandas.read_csv() dokumentation.

Pandas read_csv() Exempel

Kodavsnittet nedan namnger alla 15 kolumner, pekar pรฅ UCI-filen och tar bort mellanrummet som fรถljer varje komma i just den hรคr datamรคngden.

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

Produktion:

(32561, 15)

Formen bekrรคftar 32 561 rader och 15 kolumner, sรฅ varje namn i COLUMNS matchades med ett fรคlt i filen.

Nyckelparametrar fรถr Pandas read_csv()

read_csv() accepterar fler รคn femtio argument, men en liten grupp tรคcker nรคstan alla verkliga importer. Standardvรคrdena nedan รคr de som dokumenteras i den aktuella pandas API-referensen.

Parameter Standard Vad den gรถr
september '' Tecken eller regex anvรคnds som avgrรคnsare. Anvรคnd sep=';' eller sep='\t' fรถr andra format.
rubrik sluta sig till Radnummer som innehรฅller kolumnetiketterna. Skicka header=None nรคr filen inte har nรฅgon rubrikrad.
namn inte instรคlld Explicit lista med kolumnetiketter. Kombinera med header=0 fรถr att ersรคtta en befintlig rubrik.
index_kol Ingen Kolumn som ska anvรคndas som radindex. index_col=False tvingar fram ett vanligt heltalsindex.
usecols Ingen Delmรคngd av kolumner att lรคsa in, efter etikett eller position. Minskar bรฅde parsningstid och minne.
dtype Ingen Datatyper per kolumn, till exempel {'age': 'int32'}. Hoppar รถver typinferens.
na_vรคrden Ingen Extra strรคngar att lรคsa som NaN, till exempel platshรฅllaren '?' i datamรคngden fรถr vuxna.
hoppa รถver rader / nrows Ingen Hoppa รถver inledande rader, eller lรคs endast de fรถrsta N dataraderna.
parse_dates Ingen Kolumner som ska konverteras till datetime under lรคsning, i kombination med date_format.
kodning 'utf-8' Textkodning av filen. Anvรคnd 'latin-1' eller 'cp1252' fรถr export av รคldre filer.
bitstorlek Ingen Returnera en iterator som ger filen i block om N rader.
pรฅ_dรฅliga_linjer 'fel' Vad man ska gรถra med felaktigt utformade rader: hรถja, varna eller hoppa รถver dem.

Tvรฅ av dessa fรถrtjรคnar en anmรคrkning. index_col=False รคr inte detsamma som att lรคmna den oinstรคlld: den sรคger uttryckligen รฅt Pandas att inte flytta upp den fรถrsta kolumnen, vilket รคr vad man vill ha nรคr en fil avslutar varje rad med en lรถs avgrรคnsare. Och names skriver tyst รถver vad filen deklarerar, sรฅ skicka vidare header=0 bredvid den nรคr CSV-filen verkligen har en rubrikrad.

Pandas groupby() Metod

Ett enkelt sรคtt att se data รคr att anvรคnda groupby-metoden. Den hรคr metoden kan hjรคlpa dig att sammanfatta data per grupp. Nedan fรถljer en lista รถver aggregeringar som รคr tillgรคngliga med groupby()-metoden:

  • rรคkna: rรคkna
  • min: min
  • max: max
  • elak elak
  • median: median
  • standardavvikelse: std
  • och andra

Inuti groupby() namnger du kolumnen du vill gruppera pรฅ innan du tillรคmpar aggregeringen.

Lรฅt oss ta en titt pรฅ en enda gruppping med vuxendatasetet. Du fรฅr medelvรคrdet av alla kontinuerliga variabler per intรคktstyp, det vill sรคga รถver 50 000 eller under 50 000:

df_train.groupby(['label']).mean()
etikett รฅlder fnlwgt utbildningsnummer kapitalvinsten kapitalfรถrlust timmar_vecka
<= 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รฅ minimiรฅldern per hushรฅllstyp:

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

Du kan ocksรฅ gruppera efter flera kolumner. Du kan till exempel fรฅ den maximala kapitalvinsten beroende pรฅ hushรฅllstyp och civilstรฅnd.

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 skapa ett diagram efter en gruppering. Ett sรคtt att gรถra det รคr att plotta det grupperade resultatet direkt.

Fรถr att skapa ett tydligare diagram, anvรคnd unstack() efter mean() sรฅ att civilstรฅndet flyttas frรฅn indexet till kolumnerna. Diagrammet har dรฅ tvรฅ grupper, en per inkomstklass, istรคllet fรถr de fjorton (2*7) staplar som ett platt flernivรฅindex skulle producera.

Om du anvรคnder en Jupyter Notebook, kom ihรฅg att lรคgga till %matplotlib inline, annars visas inget plott.

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

Om man plottar den ostaplade ramen som ett stapeldiagram fรฅr man figuren nedan.

Grupperat stapeldiagram รถver genomsnittlig kapitalvinst efter inkomstklass och civilstรฅnd

Hur man lรคser stora CSV-filer med Pandas

Vuxendatasetet รคr litet, men samma anrop kan stanna vid en export pรฅ flera gigabyte. Tre argument gรถr det mesta av arbetet.

  • usecols laddar bara de kolumner du faktiskt behรถver. Pandas dokumentation noterar att detta resulterar i mycket snabbare parsning och lรคgre minnesanvรคndning.
  • dtype fรคster varje kolumn till en typ, sรฅ Pandas hoppar รถver inferens och utรถkar inte heltal till 64-bitars som standard.
  • bitstorlek returnerar en TextFileReader istรคllet fรถr en DataFrame, vilket lรฅter dig loopa รถver block med N rader och aggregera allt eftersom.
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)

Ytterligare tvรฅ alternativ hjรคlper nรคr grunderna รคr pรฅ plats. engine='pyarrow' vรคxlar till den flertrรฅdade Arrow-parsern, och dtype_backend='pyarrow' behรฅller resultatet i pilbakgrundade kolumner. low_memory รคr True som standard, vilket analyserar filen internt i delar, men det kan producera blandade typer i en kolumn; ange en explicit dtype istรคllet fรถr att fรถrlita sig pรฅ den.

Slutligen compression='infer' betyder att en sรถkvรคg som slutar pรฅ .gz, .zip, .bz2, .xz eller .zst dekomprimeras direkt, sรฅ det finns inget behov av att packa upp ett arkiv innan det lรคses.

Vanliga Pandas read_csv()-fel och hur man รฅtgรคrdar dem

De flesta read_csv()-fel har fyra orsaker, och var och en har ett dokumenterat argument som lรถser det.

Fel Orsak Fast
FileNotFoundError Sรถkvรคgen รคr relativ till arbetskatalogen, inte till skriptet. Anvรคnd en absolut sรถkvรคg, eller bekrรคfta URL Schemet รคr ett av http, ftp, s3, gs eller file.
UnicodeAvkodningsfel Filen รคr inte UTF-8, vilket รคr standardkodningen. Skicka encoding='latin-1โ€ฒ eller rรคtt codec, eller encoding_errors='replace'.
ParserError: Fel vid tokenisering av data En rad innehรฅller fler fรคlt รคn vad rubriken anger. Pass on_bad_lines='skip' eller 'warn', eller ange rรคtt sep.
DtypeWarning: kolumner har blandade typer Chunked type inference sรฅg olika typer i en kolumn. Ange en explicit dtype, eller low_memory=False.
Kolumner fรถrskjutna med ett En efterfรถljande avgrรคnsare gรถr att Pandas flyttar upp det fรถrsta fรคltet till indexet. Skicka index_col=False.

Datasetet fรถr vuxna visar fallet med saknade vรคrden direkt: okรคnda poster fรถr arbetsklass, yrke och native_country lagras som ett bokstavligt frรฅgetecken, sรฅ de anlรคnder som strรคngen '?' om du inte deklarerar 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)

Vanliga frรฅgor

Bรฅda anropar samma parser. read_csv() anvรคnder som standard ett kommaavgrรคnsare, medan read_table() lรคser en generellt avgrรคnsad fil och fรถrvรคntar sig att du sjรคlv anger sep. Anvรคnd read_csv() fรถr kommateckenfiler och read_table() fรถr tabb- eller pipe-separerade exporter.

Anropa df.to_csv('output.csv', index=False). Slรคppping Indexet undviker en namnlรถs fรถrsta kolumn vid nรคsta lรคsning. Lรคgg till sep-, encoding- eller compression-argument fรถr att spegla de instรคllningar du anvรคnde nรคr filen importerades.

Skicka parse_dates med kolumnnamnen eller positionerna och lรคgg till date_format nรคr layouten inte รคr ISO 8601, till exempel date_format='%d/%m/%Y'. Utan den anlรคnder date-kolumner som vanliga objektstrรคngar och behรถver ett separat to_datetime-anrop.

Ange sep fรถr tecknet, till exempel sep=';' eller sep='\t'. Avgrรคnsare som รคr lรคngre รคn ett tecken behandlas som reguljรคra uttryck och tvingar fram det lรฅngsammare Python engine.sep=None lรฅter den motorn sniffa avgrรคnsare frรฅn den fรถrsta giltiga raden.

Anvรคnd nrows fรถr att begrรคnsa antalet returnerade datarader och skiprows fรถr att hoppa fรถrbi ett block med inledande rader. Genom att kombinera dem kan du blรคddra igenom en fil, till exempel skiprows=1000000 med nrows=999999, fรถr att lรคsa den andra miljonen rader.

Ja. Standardinstรคllningen fรถr komprimering รคr "infer", sรฅ en sรถkvรคg som slutar pรฅ .gz, .zip, .bz2, .xz eller .zst dekomprimeras automatiskt. URLs anvรคnder http, ftp, s3, gs eller file allt arbete, och storage_options skickar inloggningsuppgifter till fjรคrrbackend.

Trรคnade modeller flaggar sannolika typfel, klustrar nรคstan dubbletter av kategoristavningar och imputerar saknade vรคrden frรฅn omgivande kolumner. Det begrรคnsar den manuella rensningen till de rader som en regelbaserad na_values- eller dtype-instรคllning inte kan lรถsa pรฅ egen hand.

Copilot utarbetar standardtexten snabbt nรคr den kan se ett exempel pรฅ filen. Behandla argumentlistan som ett utkast, eftersom den ofta gissar dtype och kodning. Kontrollera varje genererat nyckelord mot pandas API-referens innan den kรถrs.

Sammanfatta detta inlรคgg med: