Pandák read_csv() függvénye Python példával
⚡ Okos összefoglaló
A Pandas read_csv() függvény egyetlen hívással DataFrame-mé alakít egy vesszővel elválasztott fájlt (lokális vagy távoli). Ez a bemutató importálja az UCI felnőtt népszámlálási adatkészletét, elnevezi a tizenöt oszlopát, és csoportos összesítésekkel összegzi az eredményt.
CSV importálása a Pandasba
A TensorFlow oktatóanyag során a következőket fogod használni: felnőtt adatkészlet, amelyet gyakran használnak osztályozási feladatokhoz. Az alább használt fájl a nyers adult.data exportálás az UCI Machine Learning Repository-ból, és az adatkészlet oldala zip formátumban letölthetővé teszi a fájlt. ucimlrepo csomagot, ha a közvetlen elérési út feloldása valaha is megszakad.
Az adatokat CSV formátumban tárolja a rendszer. Az adathalmaz 8 kategorikus változót tartalmaz:
- munkaosztály
- szabott oktatás
- házastársi
- foglalkozás
- kapcsolat
- verseny
- szex
- Szülőföld
És 6 folytonos változó:
- kor
- fnlwgt
- oktatási_szám
- tőkenyereség
- tőke_veszteség
- óra_hét
A jövedelemmel együtt label oszlop, amely megadja a 15 oszlopnevet, amelyeknek át kell adni pandák a következő részben.
Pandák read_csv() módszer
CSV adathalmaz importálásához használhatod a pd.read_csv() objektumot. Az alapvető aláírás a következő:
Pandák read_csv() Szintaxis
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- fájlútvonal_vagy_puffer: ösvény, URL, vagy fájlszerű objektum, amely az adatokat tárolja
- szept=',': a használandó elválasztójel
- nevek=Nincs: nevezd el az oszlopokat. Ha az adathalmaz tíz oszlopból áll, akkor tíz nevet kell megadnod.
- index_col=Nincs: melyik oszlopot kell sorindexként használni. Hamis értéket adunk meg egy új egész index kikényszerítéséhez.
- skipinitialspace=Hamis: szóközök kihagyása az elválasztójel után
Az érvek teljes listájáért tekintse meg a hivatalos oldalt pandas.read_csv() dokumentáció.
Pandák read_csv() Példa
Az alábbi kódrészlet mind a 15 oszlopot elnevezi, az UCI fájlra mutat, és eltávolítja a vesszők utáni szóközt ebben az adott adathalmazban.
## 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)
Az alakzat 32 561 sort és 15 oszlopot erősít meg, így a COLUMNS minden neve egyezett a fájl egy mezőjével.
A Pandas read_csv() fő paraméterei
A read_csv() több mint ötven argumentumot fogad el, de egy kisebb csoportja szinte minden valódi importálást lefed. Az alábbi alapértelmezett értékek a jelenlegi pandas API referenciában dokumentáltak.
| Vizsgált paraméter | alapértelmezett | Mit csinál |
| szeptember | '' | Elválasztóként használt karakter vagy reguláris kifejezés. Más formátumokhoz használja a sep=';' vagy a sep='\t' formátumot. |
| header | 'következtet' | Az oszlopcímkéket tartalmazó sor száma. Header=None értéket kell adni, ha a fájlnak nincs fejlécsora. |
| nevek | nincs beállítva | Oszlopcímkék explicit listája. A header=0 paraméterrel kombinálva egy meglévő fejlécet cserélhet le. |
| index_oszlop | Egyik sem | Sorindexként használandó oszlop. Az index_col=False érték sima egész indexet kényszerít ki. |
| usecols | Egyik sem | Betöltendő oszlopok részhalmaza címke vagy pozíció szerint. Csökkenti az elemzési időt és a memóriát. |
| dtype | Egyik sem | Oszloponkénti adattípusok, például {'age': 'int32'}. Kihagyja a típuskövetkeztetést. |
| na_values | Egyik sem | NaN-ként olvasható extra karakterláncok, például a '?' helyőrző a felnőtt adathalmazban. |
| skiprows / nrrows | Egyik sem | Kihagyja a vezető sorokat, vagy csak az első N adatsort olvassa be. |
| elemzési_dátumok | Egyik sem | Az olvasás során datetime formátumra konvertálandó oszlopok, a date_format paraméterrel párosítva. |
| kódolás | 'utf-8' | A fájl szöveges kódolása. Régi exportokhoz használja a „latin-1” vagy a „cp1252” formátumot. |
| darabméretű | Egyik sem | Egy iterátort ad vissza, amely N soros blokkokban adja vissza a fájlt. |
| rossz_vonalakon | 'hiba' | Mi a teendő a hibásan formázott sorokkal: emelés, figyelmeztetés vagy kihagyás. |
Ezek közül kettő említést érdemel. index_col=False nem ugyanaz, mintha nem állítanánk be: explicit módon arra utasítja a Pandákat, hogy ne léptessenek elő az első oszlopot, ami akkor van szükség, ha egy fájl minden sorát egy eltévedt elválasztójellel zárjuk. És names csendben felülírja a fájlban deklarált dolgokat, ezért add át header=0 mellette, amikor a CSV-nek valóban van fejlécsora.
Pandák groupby() Method
Az adatok megtekintésének egy egyszerű módja a groupby metódus használata. Ez a metódus segíthet az adatok csoportosításában. Az alábbiakban a groupby() metódussal elérhető összesítések listája látható:
- szám: számol
- min: min
- max: max
- jelent: jelent
- medián: medián
- szórás: standard eltérés
- és mások
A groupby() függvényen belül elnevezed az oszlopot, amely alapján csoportosítani szeretnél, mielőtt az összesítést alkalmaznád.
Vessünk egy pillantást egyetlen csoportraping a felnőtt adathalmazzal. Megkapod az összes folytonos változó átlagát bevételtípus szerint, azaz 50 ezer felett vagy 50 ezer alatt:
df_train.groupby(['label']).mean()
| címke | kor | fnlwgt | oktatási_szám | tőkenyereség | tőke_veszteség | óra_hét |
| <= 50 ezer | 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 |
A minimális életkort háztartástípus szerint tudhatod meg:
df_train.groupby(['label'])['age'].min() label <=50K 17 >50K 19 Name: age, dtype: int64
Több oszlop szerint is csoportosíthat. Például a háztartás típusa és a családi állapot szerint maximális tőkenyereséget kaphat.
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
Létrehozhatsz egy diagramot egy csoportosítás után. Ennek egyik módja, ha közvetlenül a csoportosított eredményt ábrázolod.
A jobb láthatóság érdekében az unstack() függvényt a mean() után alkalmazzuk, így a családi állapot az indexből az oszlopokba kerül. A diagram ekkor két csoportot tartalmaz, jövedelmi címkénként egyet, a tizennégy (2*7) oszlop helyett, amit egy lapos, többszintű index eredményezne.
Ha a Jupyter jegyzetfüzet, ne felejtsd el beilleszteni a %matplotlib parancsot a sorba, különben nem jelenik meg a diagram.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
Ha ezt a nem egymásra helyezett keretet oszlopdiagramként ábrázoljuk, az alábbi ábrát kapjuk.
Hogyan olvassunk nagy CSV fájlokat a Pandákkal
A felnőtt adathalmaz kicsi, de ugyanaz a hívás több gigabájtos exportálásnál is elakadhat. Három argumentum végzi el a munka nagy részét.
- usecols csak azokat az oszlopokat tölti be, amelyekre valójában szükséged van. A pandas dokumentációja megjegyzi, hogy ez sokkal gyorsabb elemzést és alacsonyabb memóriahasználatot eredményez.
- dtype minden oszlopot egy típushoz rendel, így a Pandas kihagyja a következtetést, és alapértelmezés szerint nem szélesíti ki az egész számokat 64 bitesre.
- darabméretű egy TextFileReader-t ad vissza DataFrame helyett, lehetővé téve, hogy N soros blokkokon keresztül cikluson keresztül összesítse az adatokat.
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)
Két további lehetőség segít, ha az alapok a helyükön vannak. engine='pyarrow' átvált a többszálú Arrow elemzőre, és dtype_backend='pyarrow' az eredményt nyíllal hátrébb sorolt oszlopokban tartja. low_memory alapértelmezés szerint igaz, ami a fájlt belsőleg, darabokban elemzi, de vegyes típusokat is létrehozhat egy oszlopban; ahelyett, hogy arra hagyatkozna, állítson be explicit dtype-ot.
Végül, compression='infer' azt jelenti, hogy a .gz, .zip, .bz2, .xz vagy .zst kiterjesztésű elérési utak menet közben kicsomagolásra kerülnek, így az archívumot nem kell kicsomagolni az olvasás előtt.
Gyakori Panda read_csv() hibák és javításuk
A read_csv() függvény hibáinak többsége négy okból ered, és mindegyikhez tartozik egy dokumentált argumentum, amely megoldja a problémát.
| hiba | Okoz | Rögzít |
| FileNotFoundError | Az elérési út a munkakönyvtárhoz viszonyított, nem a szkripthez. | Használjon abszolút elérési utat, vagy erősítse meg a URL A séma a következők egyike lehet: http, ftp, s3, gs vagy file. |
| UnicodeDecodeError | A fájl nem UTF-8 kódolású, ami az alapértelmezett. | Add meg az encoding='latin-1′ értéket vagy a helyes kodeket, illetve az encoding_errors='replace' értéket. |
| ParserError: Hiba az adatok tokenizálása során | Egy sor több mezőt tartalmaz, mint amennyit a fejléc deklarál. | Add meg az on_bad_lines='skip' vagy 'warn' paramétert, vagy állítsd be a helyes szep értékét. |
| DtypeWarning: az oszlopok vegyes típusokat tartalmaznak | A darabolt típuskövetkeztetés különböző típusokat látott egy oszlopban. | Állítson be explicit dtype értéket, vagy a low_memory=False értéket. |
| Oszlopok eltolva eggyel | Egy záró elválasztójel arra készteti a Pandákat, hogy az első mezőt az indexbe léptessék elő. | Adja át az index_col=False értéket. |
A felnőtt adathalmaz közvetlenül mutatja a hiányzó érték esetét: az ismeretlen munkaosztály, foglalkozás és natív ország bejegyzések literális kérdőjelként vannak tárolva, így '?' karakterláncként érkeznek, hacsak nem deklarálod őket.
# 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)

