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.

  • 🔘 Jeden hovor: pd.read_csv() přijímá cestu k souboru, URLnebo jakýkoli objekt zpřístupňující metodu čtení.
  • ☑️ Ovládání sloupce: Pro označení sloupců předejte názvy a pro zachování prostého celočíselného indexu předejte index_col=False.
  • (Tj. Mezera: skipinitialspace=True odstraní mezeru, která následuje za každou čárkou v datové sadě pro dospělé.
  • 🧪 Skupina a agregace: Funkce groupby() shrnuje snímek pomocí počtu, minima, maxima, průměru, mediánu nebo standardu.
  • 🛠️ Velké soubory: Funkce usecols, dtype a chunksize snižují čas analýzy a paměť u exportů o velikosti více gigabajtů.
  • ⚠️ Běžné chyby: Kódování, chybné řádky a smíšené dtypy mají zdokumentovaný argument, který je opravuje.

Pandy read_csv() s příkladem

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.

Seskupený sloupcový graf průměrného kapitálového zisku podle příjmové skupiny a rodinného stavu

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)

Nejčastější dotazy

Oba volají stejný parser. read_csv() standardně používá oddělovač čárkou, zatímco read_table() čte obecný soubor s oddělovači a očekává, že si sami nastavíte oddělovač. Pro soubory s čárkou použijte read_csv() a pro exporty oddělené tabulací nebo svislými čarami použijte read_table().

Zavolejte df.to_csv('output.csv', index=False). Zrušteping Index se při dalším čtení vyhne nepojmenovanému prvnímu sloupci. Přidejte argumenty sep, encoding nebo komprese, abyste zrcadlili nastavení použitá při importu souboru.

Předávejte parse_dates s názvy nebo pozicemi sloupců a přidejte date_format, pokud rozvržení neodpovídá ISO 8601, například date_format='%d/%m/%Y'. Bez něj se sloupce s datem zobrazují jako prosté objektové řetězce a vyžadují samostatné volání to_datetime.

Nastavte sep na znak, například sep=';' nebo sep='\t'. Oddělovače delší než jeden znak jsou považovány za regulární výrazy a vynucují pomalejší Python engine.sep=None umožňuje enginu prohledávat oddělovač od prvního platného řádku.

Pro omezení počtu vrácených datových řádků použijte funkci nrows a pro přeskakování za blok úvodních řádků použijte funkci skiprows. Jejich kombinací procházíte soubor, například skiprows=1000000 s nrows=999999, chcete-li přečíst druhý milion řádků.

Ano. Komprese je standardně nastavena na „infer“, takže cesta končící na .gz, .zip, .bz2, .xz nebo .zst se automaticky dekomprimuje. URLPoužití http, ftp, s3, gs nebo file funguje a storage_options předává přihlašovací údaje vzdálenému backendu.

Trénované modely označují pravděpodobné chyby typu, seskupují téměř duplicitní pravopisy kategorií a imputují chybějící hodnoty z okolních sloupců. To zužuje ruční čištění na řádky, které nastavení na_values ​​nebo dtype založené na pravidlech nedokáže samo o sobě vyřešit.

Copilot rychle vytvoří koncept, jakmile uvidí vzorek souboru. Seznam argumentů považujte za koncept, protože často odhaduje typ dat a kódování. Před spuštěním zkontrolujte každé vygenerované klíčové slovo oproti referenci API pandas.

Shrňte tento příspěvek takto: