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

