Пандите read_csv() в Python с Пример

⚡ Умно обобщение

Функцията read_csv() на Pandas превръща файл, разделен със запетаи, локален или отдалечен, в DataFrame с едно извикване. Това ръководство импортира набора от данни за преброяване на възрастни от UCI, именува неговите петнадесет колони и обобщава резултата с агрегации по групи.

  • 🔘 Едно обаждане: pd.read_csv() приема път към файл, a URLили всеки обект, който излага метод за четене.
  • ☑️ Контрол на колоната: Предайте имена, за да обозначите колоните, и index_col=False, за да запазите обикновен целочислен индекс.
  • интервал: skipinitialspace=True премахва интервала, който следва всяка запетая в набора от данни за възрастни.
  • 🧪 Група и агрегат: groupby() обобщава кадъра с брой, минимум, максимум, средна стойност, медиана или стандарт.
  • 🛠️ Големи файлове: usecols, dtype и chunksize намаляват времето за парсиране и паметта при експортиране от няколко гигабайта.
  • ⚠️ Често срещани грешки: Кодирането, лошите редове и смесените dtype-ове имат документиран аргумент, който ги поправя.

Pandas read_csv() с пример

Импортирайте CSV в Pandas

По време на урока за TensorFlow ще използвате набор от данни за възрастни, който често се използва за задачи по класификация. Файлът, използван по-долу, е суровият adult.data експортиране от хранилището за машинно обучение на UCI, а страницата с набор от данни предлага и zip файл за изтегляне и ucimlrepo пакет, ако директният път някога спре да се разрешава.

Данните се съхраняват във формат CSV. Наборът от данни включва 8 категорични променливи:

  • работен клас
  • образование
  • брачен
  • окупация
  • връзка
  • раса
  • секс
  • родна_страна

И 6 непрекъснати променливи:

  • възраст
  • fnlwgt
  • образование_номер
  • капиталова_печалба
  • капиталова_загуба
  • часове_седмица

Заедно с доходите label колона, която прави 15-те имена на колони, на които ще предадете Пандите в следващия раздел.

Метод Pandas read_csv().

За да импортирате CSV набор от данни, можете да използвате обекта pd.read_csv(). Основната сигнатура е:

Синтаксис на Pandas read_csv().

pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
  • filepath_or_bufferпът, URLили файлоподобен обект, съдържащ данните
  • sep=',': разделителят, който да се използва
  • имена=Няма: наименувайте колоните. Ако наборът от данни има десет колони, трябва да подадете десет имена
  • index_col=Няма: коя колона да се използва като индекс на ред. Предайте False, за да се принуди нов целочислен индекс
  • skipinitialspace=False: пропускане на интервали след разделителя

За пълния списък с аргументи, вижте официалния Документация за pandas.read_csv().

Pandas read_csv() Пример

Фрагментът по-долу назовава всичките 15 колони, сочи към UCI файла и премахва интервала, който следва всяка запетая в този конкретен набор от данни.

## 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

Изход:

(32561, 15)

Формата потвърждава 32 561 реда и 15 колони, така че всяко име в COLUMNS е съпоставено с поле във файла.

Ключови параметри на Pandas read_csv()

read_csv() приема повече от петдесет аргумента, но малка група обхваща почти всеки реален импорт. Стойностите по подразбиране по-долу са документираните в текущия справочник на API на pandas.

Параметър По подразбиране Какво го прави
септември ',' Символ или регулярен израз, използван като разделител. Използвайте sep=';' или sep='\t' за други формати.
хедър „извеждам“ Номер на ред, съдържащ етикетите на колоните. Предайте header=None, когато файлът няма заглавен ред.
имена не е зададено Изричен списък с етикети на колони. Комбинирайте с header=0, за да замените съществуващ заглавен файл.
индекс_колона None Колона, която да се използва като индекс на ред. index_col=False налага обикновен целочислен индекс.
употреби None Подмножество от колони за зареждане, по етикет или позиция. Намалява времето за анализ и паметта.
dtype None Типове данни за колона, например {'age': 'int32'}. Пропуска извеждането на типа.
na_стойности None Допълнителни низове, които да се четат като NaN, като например заместващия знак „?“ в набора от данни за възрастни.
прескочени редове / редове None Пропускане на водещите редове или четене само на първите N реда с данни.
дати_на_анализа None Колони за преобразуване в дата и час при четене, сдвоени с date_format.
кодиране „utf-8“ Текстово кодиране на файла. Използвайте „latin-1“ или „cp1252“ за експортирани версии.
размер на парчето None Връща итератор, който извежда файла в блокове от N реда.
на_лоши_линии грешка Какво да правите с деформирани редове: да ги повдигнете, предупредите или пропуснете.

Две от тях заслужават специално внимание. index_col=False не е същото като да го оставите незададено: това изрично казва на Pandas да не промотира първата колона, което е това, което искате, когато файлът завършва всеки ред с ненужен разделител. И names тихо презаписва каквото и да е декларирано във файла, така че пас header=0 до него, когато CSV файлът наистина съдържа заглавен ред.

Метод Pandas groupby().

Лесен начин да видите данните е да използвате метода groupby. Този метод може да ви помогне да обобщите данните по групи. По-долу е даден списък с агрегации, достъпни с метода groupby():

  • брои: брои
  • мин.: мин
  • макс.: макс
  • средно: средно
  • медиана: медиана
  • стандартно отклонение: std
  • и други

Вътре в groupby() посочвате колоната, по която искате да групирате, преди да приложите агрегирането.

Нека да разгледаме една групаping с набора от данни за възрастни. Ще получите средната стойност на всички непрекъснати променливи по вид приход, който е над 50 000 или под 50 000:

df_train.groupby(['label']).mean()
етикет възраст fnlwgt образование_номер капиталова_печалба капиталова_загуба часове_седмица
<= 50K 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

Можете да получите минималната възраст по вид домакинство:

df_train.groupby(['label'])['age'].min()
label
<=50K    17
>50K     19
Name: age, dtype: int64

Можете също да групирате по няколко колони. Например, можете да получите максимална капиталова печалба според вида на домакинството и семейното положение.

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

Можете да създадете графика след групиране. Един от начините да го направите е да начертаете групирания резултат директно.

За да създадете по-ясна графика, приложете unstack() след mean(), така че семейното положение да се премести от индекса в колоните. След това графиката има две групи, по една за етикет на дохода, вместо четиринадесетте (2*7) стълба, които би генерирал плосък многостепенен индекс.

Ако използвате a Jupyter Ноутбук, не забравяйте да добавите %matplotlib inline, в противен случай няма да се покаже графика.

%matplotlib inline
df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack()
df_plot

Нанасянето на този ненаслагван кадър като стълбовидна диаграма дава фигурата по-долу.

Групирана стълбовидна диаграма на средната капиталова печалба по доход и брачно положение

Как да четете големи CSV файлове с Pandas

Наборът от данни за възрастни е малък, но едно и също извикване може да се блокира при експорт от няколко гигабайта. Три аргумента вършат по-голямата част от работата.

  • употреби зарежда само колоните, от които действително се нуждаете. Документацията на pandas отбелязва, че това води до много по-бързо парсиране и по-ниско използване на памет.
  • dtype закрепва всяка колона към тип, така че Pandas пропуска извода и не разширява целите числа до 64-битови по подразбиране.
  • размер на парчето връща TextFileReader вместо DataFrame, което ви позволява да преглеждате блокове от N реда и да ги агрегирате в движение.
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)

Две допълнителни опции помагат, след като основните неща са налице. engine='pyarrow' превключва към многонишковия анализатор Arrow и dtype_backend='pyarrow' запазва резултата в колони, подчертани със стрелки. low_memory е True по подразбиране, което анализира файла вътрешно на части, но може да генерира смесени типове в колона; задайте изричен dtype, вместо да разчитате на него.

И накрая, compression='infer' означава, че път, завършващ на .gz, .zip, .bz2, .xz или .zst, се декомпресира в движение, така че няма нужда да разопаковате архива преди да го прочетете.

Често срещани грешки при read_csv() в Pandas и как да ги поправим

Повечето неуспехи на read_csv() възникват по четири причини и всяка от тях има документиран аргумент, който я разрешава.

грешка Причина Фиксирайте
Грешка при FileNotFound Пътят е относителен спрямо работната директория, а не спрямо скрипта. Използвайте абсолютен път или потвърдете URL схемата е една от http, ftp, s3, gs или file.
Грешка в UnicodeDecodeError Файлът не е UTF-8, което е кодирането по подразбиране. Подайте encoding='latin-1′ или правилния кодек, или encoding_errors='replace'.
ParserError: Грешка при токенизиране на данни Един ред съдържа повече полета, отколкото е посочено в заглавката. Предайте on_bad_lines='skip' или 'warn' или задайте правилната sep.
DtypeWarning: колоните са със смесени типове Изводът от тип на парчета виждаше различни типове в една колона. Задайте изричен dtype или low_memory=False.
Колоните са изместени с една Разделителят в края кара Pandas да промотира първото поле в индекса. Pass index_col=False.

Наборът от данни за възрастни показва директно случая на липсваща стойност: неизвестните записи за workclass, occupation и native_country се съхраняват като буквален въпросителен знак, така че пристигат като низ '?', освен ако не ги декларирате.

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

Въпроси и Отговори

И двата извикват един и същ парсер. read_csv() по подразбиране използва разделител със запетая, докато read_table() чете общ файл със запетаи и очаква сами да зададете разделител. Използвайте read_csv() за файлове със запетаи и read_table() за експортиране, разделено с табулация или вертикална черта.

Извикайте df.to_csv('output.csv', index=False). Изтрийтеping Индексът избягва неназована първа колона при следващото четене. Добавете аргументи sep, encoding или compression, за да отразявате настройките, които сте използвали при импортирането на файла.

Предайте parse_dates с имената или позициите на колоните и добавете date_format, когато оформлението не е ISO 8601, например date_format='%d/%m/%Y'. Без него колоните с дати пристигат като обикновени обектни низове и се нуждаят от отделно извикване на to_datetime.

Задайте sep на символа, например sep=';' или sep='\t'. Разделителите, по-дълги от един символ, се третират като регулярни изрази и налагат по-бавния Python engine.sep=None позволява на този engine да провери разделителя от първия валиден ред.

Използвайте nrows, за да ограничите броя на върнатите редове с данни, и skiprows, за да прескочите блок от водещи редове. Комбинирането им прелиства страниците във файла, например skiprows=1000000 с nrows=999999, за да прочетете втория милион реда.

Да. компресията по подразбиране е „infer“, така че път, завършващ на .gz, .zip, .bz2, .xz или .zst, се декомпресира автоматично. URLИзползването на http, ftp, s3, gs или file работи, а storage_options предава идентификационни данни на отдалечения backend.

Обучените модели сигнализират за вероятни грешки в типа, групират почти дублирани изписвания на категории и импутират липсващи стойности от околните колони. Това стеснява ръчното почистване до редовете, които базирана на правила настройка na_values ​​или dtype не може да разреши самостоятелно.

Copilot бързо изготвя шаблона, след като види примерен файл. Третирай списъка с аргументи като чернова, защото често отгатва dtype и encoding. Провери всяка генерирана ключова дума спрямо препратката към API на pandas, преди да я изпълни.

Обобщете тази публикация с: