Пандите read_csv() в Python с Пример
⚡ Умно обобщение
Функцията read_csv() на Pandas превръща файл, разделен със запетаи, локален или отдалечен, в DataFrame с едно извикване. Това ръководство импортира набора от данни за преброяване на възрастни от UCI, именува неговите петнадесет колони и обобщава резултата с агрегации по групи.
Импортирайте 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)

