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.

  • 🔘 Egy hívás: A pd.read_csv() függvény fájlútvonalat, egy URL, vagy bármely olyan objektum, amely egy olvasási metódust tesz elérhetővé.
  • ☑️ Oszlopvezérlés: Adjon át neveket az oszlopok címkézéséhez, és index_col=False értéket egy egyszerű egész index megtartásához.
  • Fehér űr: skipinitialspace=True érték esetén a felnőtt adathalmazban minden vessző utáni szóköz eltűnik.
  • 🧪 Csoportosítás és összesítés: A groupby() a keretet darabszám, minimum, maximum, átlag, medián vagy sztandard értékekkel összegzi.
  • 🇧🇷 Nagy fájlok: A usecols, dtype és chunksize függvények csökkentik az elemzési időt és a memóriaigényt több gigabájtos exportok esetén.
  • ⚠️ Gyakori hibák: A kódolás, a hibás sorok és a kevert adattípusok mindegyikéhez tartozik egy dokumentált argumentum, amely kijavítja őket.

Pandák olvassák a_csv() függvényt példával

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.

Csoportosított oszlopdiagram az átlagos tőkenyereségről jövedelemcímke és családi állapot szerint

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)

GYIK

Mindkettő ugyanazt az elemzőt hívja meg. A read_csv() alapértelmezés szerint vesszővel elválasztott karaktert használ, míg a read_table() egy általános elválasztott karakterekkel elválasztott fájlt olvas be, és elvárja, hogy a sep értéket magad állítsd be. Használd a read_csv() függvényt vesszős fájlokhoz, és a read_table() függvényt tabulátorral vagy függőleges vonallal elválasztott exportokhoz.

Hívja meg a df.to_csv('output.csv', index=False) függvényt.ping Az index elkerüli a névtelen első oszlopot a következő olvasáskor. Adjon hozzá szep, kódolás vagy tömörítés argumentumokat, hogy tükrözze a fájl importálásakor használt beállításokat.

Adja át a parse_dates változót oszlopnevekkel vagy pozíciókkal, és adja hozzá a date_format változót, ha az elrendezés nem ISO 8601 szabványú, például date_format='%d/%m/%Y'. Enélkül a dátum oszlopok egyszerű objektumkarakterláncként érkeznek, és külön to_datetime hívást igényelnek.

Állítsd be a sep változót a karakterre, például sep=';' vagy sep='\t'. Az egy karakternél hosszabb elválasztókat a rendszer reguláris kifejezésként kezeli, és a lassabb Python engine. sep=None A „None” beállítással a keresőmotor az első érvényes sorból szimatolta ki az elválasztójelet.

Az nrows függvénnyel korlátozhatjuk a visszaadott adatsorok számát, a skiprows függvénnyel pedig egy soron túlra ugorhatunk. Ezeket kombinálva lapozhatunk egy fájlban, például a skiprows=1000000 és az nrows=999999 függvényekkel beolvashatjuk a második egymilliomodik sort.

Igen. A tömörítés alapértelmezés szerint „infer”, tehát a .gz, .zip, .bz2, .xz vagy .zst kiterjesztésű elérési utak automatikusan kicsomagolásra kerülnek. URLA http, ftp, s3, gs vagy fájl használatával történő s műveletek mind működnek, és a storage_options átadja a hitelesítő adatokat a távoli háttérrendszernek.

A betanított modellek megjelölik a valószínűsíthető típushibákat, csoportosítják a majdnem ismétlődő kategória-elírásokat, és a környező oszlopokból impulzálják a hiányzó értékeket. Ez leszűkíti a manuális tisztítást azokra a sorokra, amelyeket egy szabályalapú na_values ​​vagy dtype beállítás önmagában nem tud feloldani.

A Copilot gyorsan elkészíti a sablontervezetet, amint látja a fájl mintáját. Az argumentumlistát tervezetként kezelje, mivel gyakran kitalálja a dtype-ot és a kódolást. Futtatás előtt minden generált kulcsszót ellenőriz a pandas API referenciájával szemben.

Foglald össze ezt a bejegyzést a következőképpen: