Функция `read_csv()` в Pandas Python с примером
⚡ Умное резюме
Функция `read_csv()` библиотеки Pandas преобразует файл, разделенный запятыми (локальный или удаленный), в DataFrame за один вызов. В этом пошаговом руководстве импортируется набор данных переписи взрослого населения Калифорнийского университета в Ирвайне (UCI), присваиваются имена пятнадцати столбцам и результат суммируется с помощью агрегирования по параметрам.
Импортировать CSV в Pandas
В ходе урока по TensorFlow вы будете использовать... набор данных для взрослыхкоторый часто используется для задач классификации. Приведенный ниже файл является исходным. adult.data Экспорт из репозитория машинного обучения UCI, а на странице набора данных также доступна загрузка в заархивированном виде. ucimlrepo пакет, если прямой путь когда-либо перестанет разрешаться.
Данные хранятся в формате CSV. Набор данных включает 8 категориальных переменных:
- рабочий класс
- образование
- брачный
- оккупация
- отношения
- раса
- секс
- родная страна
И 6 непрерывных переменных:
- возраст
- фнлвгт
- образование_номер
- прирост капитала
- капитал_убыток
- часы_неделя
Вместе с доходом label столбец, это означает, что вы передадите 15 имен столбцов. Панды в следующем разделе.
Метод read_csv() в Пандах
Для импорта CSV-файла можно использовать объект pd.read_csv(). Его базовая сигнатура выглядит следующим образом:
Синтаксис read_csv() в Пандах
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- путь_файла_или_буфер: путь, URLили файлоподобный объект, содержащий данные.
- sep=',': разделитель для использования
- names=None: Присвойте имена столбцам. Если набор данных содержит десять столбцов, необходимо передать десять имен.
- index_col=None: какой столбец использовать в качестве индекса строки. Передайте False, чтобы принудительно задать новый целочисленный индекс.
- skipinitialspace=False: пропускать пробелы после разделителя
Полный список аргументов можно найти в официальном документе. документация pandas.read_csv().
Пример 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 для замены существующего заголовка. |
| индекс_столбец | Ничто | Столбец, используемый в качестве индекса строки. Значение index_col=False принудительно задает индекс в виде обычного целого числа. |
| использование коллов | Ничто | Загрузка подмножества столбцов по метке или позиции. Сокращает время синтаксического анализа и объем памяти. |
| тип | Ничто | Типы данных для каждого столбца, например, {'age': 'int32'}. Пропускает вывод типов. |
| na_values | Ничто | Дополнительные строки, которые можно читать как NaN, например, заполнитель '?' в наборе данных о взрослых. |
| скипролеты / узлы | Ничто | Пропускайте начальные строки или считывайте только первые N строк данных. |
| parse_dates | Ничто | Столбцы, которые необходимо преобразовать в формат даты и времени при чтении, в сочетании с параметром date_format. |
| кодирование | 'utf-8' | Кодировка текста файла. Используйте 'latin-1' или 'cp1252' для экспорта устаревших версий. |
| крошечный | Ничто | Возвращает итератор, который выдает файл блоками по 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()
| этикетка | возраст | фнлвгт | образование_номер | прирост капитала | капитал_убыток | часы_неделя |
| <= 50 КБ | 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) столбцов, которые получился бы при использовании плоского многоуровневого индекса.
Если вы используете Jupyter ноутбукНе забудьте добавить `%matplotlib inline`, иначе график отображаться не будет.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
Если построить столбчатую диаграмму на основе этих несгруппированных данных, получится рисунок, представленный ниже.
Как читать большие CSV-файлы с помощью Pandas
Набор данных для взрослых невелик, но тот же вызов может зависнуть при экспорте в несколько гигабайт. Большую часть работы выполняют три аргумента.
- использование коллов Загружает только те столбцы, которые вам действительно нужны. В документации pandas отмечается, что это значительно ускоряет синтаксический анализ и снижает потребление памяти.
- тип Привязывает каждый столбец к определенному типу, поэтому Pandas пропускает вывод типов и по умолчанию не расширяет целые числа до 64 бит.
- крошечный Вместо DataFrame возвращает объект TextFileReader, что позволяет перебирать блоки из 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' Результат сохраняется в столбцах, выделенных символом Arrow. low_memory По умолчанию значение равно True, что означает внутренний анализ файла по частям, но это может привести к появлению столбцов смешанных типов; вместо этого следует явно указать тип данных.
Наконец, compression='infer' Это означает, что путь, заканчивающийся на .gz, .zip, .bz2, .xz или .zst, распаковывается на лету, поэтому нет необходимости распаковывать архив перед чтением.
Распространенные ошибки функции `read_csv()` в Pandas и способы их исправления.
Большинство ошибок функции read_csv() возникают по четырем причинам, и для каждой из них существует документированный аргумент, который позволяет ее устранить.
| Ошибка | Вызывать | фиксированный |
| Филенотфаундеррор | Путь указывается относительно рабочей директории, а не относительно самого скрипта. | Используйте абсолютный путь или подтвердите его. URL Схема — одна из следующих: http, ftp, s3, gs или file. |
| Юникодекодееррор | Файл не использует кодировку UTF-8, которая является кодировкой по умолчанию. | Передайте параметр encoding='latin-1' или правильный кодек, либо encoding_errors='replace'. |
| ParserError: Ошибка токенизации данных | Строка содержит больше полей, чем указано в заголовке. | Передайте параметр on_bad_lines='skip' или 'warn', или установите правильный разделитель. |
| DtypeWarning: столбцы имеют смешанные типы | При выводе типов по частям различные типы отображались в одном столбце. | Укажите явно тип данных или используйте параметр low_memory=False. |
| Столбцы сдвинуты на один | Завершающий разделитель заставляет Pandas переместить первое поле в индекс. | Передайте 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)

