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

