Pandy read_csv() v Python s příkladem
⚡ Chytré shrnutí
Funkce read_csv() od společnosti Pandas převede soubor oddělený čárkami, lokální nebo vzdálený, do datového rámce (DataFrame) v jediném volání. Tento návod importuje datovou sadu sčítání lidu dospělých UCI, pojmenovává jejích patnáct sloupců a shrnuje výsledky pomocí agregací groupby.
Import CSV v Pandas
Během tutoriálu o TensorFlow budete používat soubor dat pro dospělé, který se často používá pro klasifikační úkoly. Níže uvedený soubor je nezpracovaný adult.data export z repozitáře strojového učení UCI a stránka s datovou sadou také nabízí stažení ve formátu ZIP a ucimlrepo balíček, pokud se přímá cesta někdy přestane řešit.
Data jsou uložena ve formátu CSV. Datová sada obsahuje 8 kategoriálních proměnných:
- pracovní třída
- vzdělání
- manželský
- povolání
- vztah
- závod
- pohlaví
- rodná země
A 6 spojitých proměnných:
- stáří
- fnlwgt
- vzdělání_číslo
- kapitálový zisk
- kapitálová_ztráta
- hodiny_týden
Spolu s příjmem label sloupec, který tvoří 15 názvů sloupců, které budete předávat Pandy v další části.
Metoda Pandas read_csv().
Pro import datové sady CSV můžete použít objekt pd.read_csv(). Základní signatura je:
Syntaxe pandy read_csv().
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- filepath_or_buffercesta, URLnebo souborový objekt obsahující data
- sep=',': oddělovač, který se má použít
- jména=Žádná: pojmenujte sloupce. Pokud má datová sada deset sloupců, je třeba předat deset názvů
- index_col=Žádný: který sloupec použít jako index řádku. Zadejte hodnotu False pro vynucení nového celočíselného indexu
- skipinitialspace=False: přeskočit mezery za oddělovačem
Úplný seznam argumentů naleznete na oficiálních stránkách Dokumentace k funkci pandas.read_csv().
Pandy read_csv() Příklad
Následující úryvek pojmenovává všech 15 sloupců, ukazuje na soubor UCI a odstraňuje mezeru, která následuje za každou čárkou v tomto konkrétním souboru dat.
## 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
Výstup:
(32561, 15)
Tvar potvrzuje 32 561 řádků a 15 sloupců, takže každé jméno v COLUMNS bylo přiřazeno k poli v souboru.
Klíčové parametry funkce Pandas read_csv()
Funkce read_csv() akceptuje více než padesát argumentů, ale malá skupina pokrývá téměř každý skutečný import. Níže uvedené výchozí hodnoty jsou ty, které jsou zdokumentovány v aktuální referenci PANDAS API.
| Parametr | Automaticky | Co to dělá |
| září | ',' | Znak nebo regulární výraz použitý jako oddělovač. Pro jiné formáty použijte sep=';' nebo sep='\t'. |
| hlavička | 'usoudit' | Číslo řádku obsahujícího popisky sloupců. Pokud soubor nemá žádný řádek záhlaví, zadejte header=None. |
| jména | Nenastaveno | Explicitní seznam popisků sloupců. V kombinaci s header=0 nahraďte existující záhlaví. |
| index_col | Nevyplněno | Sloupec, který se má použít jako index řádku. index_col=False vynutí použití prostého celočíselného indexu. |
| usecols | Nevyplněno | Podmnožina sloupců, které se mají načíst, podle popisku nebo pozice. Zkracuje dobu analýzy i paměť. |
| dtype | Nevyplněno | Datové typy pro jednotlivé sloupce, například {'age': 'int32'}. Přeskočí odvozování typů. |
| na_hodnoty | Nevyplněno | Další řetězce, které se mají číst jako NaN, například zástupný symbol '?' v datové sadě pro dospělé. |
| přeskočit řádky / přeskakovat řádky | Nevyplněno | Přeskočit úvodní řádky nebo přečíst pouze prvních N datových řádků. |
| data_analýzy | Nevyplněno | Sloupce, které se mají při čtení převést na datum a čas, spárované s argumentem date_format. |
| kódování | 'utf-8' | Kódování textu souboru. Pro starší exporty použijte „latin-1“ nebo „cp1252“. |
| velikost kousku | Nevyplněno | Vrátí iterátor, který vrátí soubor v blocích N řádků. |
| na špatných linkách | 'chyba' | Co dělat s chybně tvarovanými řádky: zvýšit jejich hodnotu, upozornit na ně nebo je přeskočit. |
Dva z nich si zaslouží zmínku. index_col=False Není to totéž jako ponechat ho nenastavený: explicitně to říká Pandám, aby nepovyšovaly první sloupec, což je to, co chcete, když soubor končí každý řádek zbytečným oddělovačem. A names tiše přepíše vše, co soubor deklaruje, takže pass header=0 vedle něj, když CSV skutečně obsahuje řádek záhlaví.
Metoda pandy groupby().
Snadný způsob, jak zobrazit data, je použití metody groupby. Tato metoda vám může pomoci shrnout data podle skupin. Níže je uveden seznam agregací dostupných s metodou groupby():
- počítat: počítat
- min: min
- max: max
- znamenat: znamenat
- medián: medián
- směrodatná odchylka: std
- a další
Uvnitř groupby() pojmenujete sloupec, podle kterého chcete seskupit, než použijete agregaci.
Pojďme se podívat na jednu skupinuping s datovou sadou pro dospělé. Získáte průměr všech spojitých proměnných podle typu příjmu, který je nad 50 tisíc nebo pod 50 tisíc:
df_train.groupby(['label']).mean()
| štítek | stáří | fnlwgt | vzdělání_číslo | kapitálový zisk | kapitálová_ztráta | hodiny_týden |
| <= 50 tis | 36.783738 | 190340.86517 | 9.595065 | 148.752468 | 53.142921 | 38.840210 |
| > 50 XNUMX tis | 44.249841 | 188005.00000 | 11.611657 | 4006.142456 | 195.001530 | 45.473026 |
Minimální věk můžete zjistit podle typu domácnosti:
df_train.groupby(['label'])['age'].min() label <=50K 17 >50K 19 Name: age, dtype: int64
Můžete také seskupit podle více sloupců. Například můžete získat maximální kapitálový zisk podle typu domácnosti a rodinného stavu.
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
Po seskupení můžete vytvořit graf. Jedním ze způsobů, jak to udělat, je vykreslit seskupený výsledek přímo.
Pro vytvoření přehlednějšího grafu použijte po funkci mean() funkci unstack(), aby se rodinný stav přesunul z indexu do sloupců. Graf pak bude mít dvě skupiny, jednu pro každý příjmový štítek, místo čtrnácti (2*7) sloupců, které by vytvořil plochý víceúrovňový index.
Používáte-li Jupyter zápisník, nezapomeňte přidat %matplotlib přímo do textu, jinak se graf nezobrazí.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
Vykreslení tohoto neskládaného snímku jako sloupcového grafu dává obrázek níže.
Jak číst velké soubory CSV pomocí Pandas
Datová sada pro dospělé je malá, ale stejné volání se může při exportu o velikosti několika gigabajtů zaseknout. Většinu práce odvedou tři argumenty.
- usecols načítá pouze sloupce, které skutečně potřebujete. Dokumentace k PANDAS uvádí, že to má za následek mnohem rychlejší parsování a nižší využití paměti.
- dtype připne každý sloupec k typu, takže Pandas přeskakuje inferenci a ve výchozím nastavení nerozšiřuje celá čísla na 64 bitů.
- velikost kousku vrací TextFileReader místo DataFrame, což umožňuje procházet bloky N řádků a agregovat je za pochodu.
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)
Jakmile jsou základní prvky připraveny, pomohou další dvě možnosti. engine='pyarrow' přepne na vícevláknový analyzátor Arrow a dtype_backend='pyarrow' uchovává výsledek ve sloupcích se šipkami. low_memory Ve výchozím nastavení je True, což soubor interně analyzuje po částech, ale může ve sloupci vytvořit smíšené typy; nastavte explicitní dtype, místo abyste se na něj spoléhali.
Konečně, compression='infer' znamená, že cesta končící na .gz, .zip, .bz2, .xz nebo .zst je dekomprimována za běhu, takže není nutné archiv před jeho načtením rozbalit.
Časté chyby funkce read_csv() v systému Pandas a jak je opravit
Většina selhání funkce read_csv() má čtyři příčiny a každá z nich má zdokumentovaný argument, který ji řeší.
| Chyba | Způsobit | Opravit |
| ChybaSouborNeNalezen | Cesta je relativní vzhledem k pracovnímu adresáři, nikoli ke skriptu. | Použijte absolutní cestu nebo potvrďte URL Schéma je jedno z http, ftp, s3, gs nebo file. |
| Chyba dekódování Unicode | Soubor není v kódování UTF-8, což je výchozí kódování. | Zadejte encoding='latin-1′ nebo správný kodek, případně encoding_errors='replace'. |
| ParserError: Chyba při tokenizaci dat | Řádek obsahuje více polí, než je uvedeno v záhlaví. | Zadejte on_bad_lines='skip' nebo 'warn', nebo nastavte správné oddělení. |
| DtypeWarning: sloupce mají smíšené typy | Odvozování blokových typů vidělo různé typy v jednom sloupci. | Nastavte explicitní typ dtype nebo low_memory=False. |
| Sloupce posunuté o jeden | Koncový oddělovač způsobí, že Pandas povýší první pole do indexu. | Předat index_col=False. |
Datová sada pro dospělé přímo ukazuje případ chybějící hodnoty: neznámé položky workclass, occupation a native_country jsou uloženy jako otazník, takže pokud je nedeklarujete, zobrazí se jako řetězec '?'.
# 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)

