Функция `read_csv()` в Pandas Python с примером

⚡ Умное резюме

Функция `read_csv()` библиотеки Pandas преобразует файл, разделенный запятыми (локальный или удаленный), в DataFrame за один вызов. В этом пошаговом руководстве импортируется набор данных переписи взрослого населения Калифорнийского университета в Ирвайне (UCI), присваиваются имена пятнадцати столбцам и результат суммируется с помощью агрегирования по параметрам.

  • 🔘 Один звонок: Функция pd.read_csv() принимает путь к файлу и т. д. URLили любой объект, предоставляющий метод чтения.
  • ☑️ Управление столбцами: Передайте имена для обозначения столбцов, а index_col=False, чтобы использовать обычный целочисленный индекс.
  • Пробел: Параметр skipinitialspace=True удаляет пробелы, следующие за каждой запятой в наборе данных для взрослых.
  • 🧪 Группировка и агрегирование: Функция groupby() суммирует данные по фрейму, указывая количество, минимум, максимум, среднее значение, медиану или стандартное отклонение.
  • 🇧🇷 Большие файлы: Параметры usecols, dtype и chunksize сокращают время анализа и объем памяти при экспорте многогигабайтных файлов.
  • ⚠️ Общие ошибки: Для исправления ошибок кодировки, некорректных строк и смешанных типов данных существует документированный аргумент.

Pandas read_csv() с примером

Импортировать 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)

Часто задаваемые вопросы (FAQ)

Обе функции используют один и тот же парсер. Функция 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='\t'. Разделители длиннее одного символа рассматриваются как регулярные выражения и приводят к более медленной обработке. Python engine.sep=None позволяет этому движку определять разделитель из первой допустимой строки.

Используйте параметр nrows для ограничения количества возвращаемых строк данных, а skiprows — для пропуска блока начальных строк. Объедините их, например, skiprows=1000000 с nrows=999999, чтобы прочитать второй миллион строк.

Да. По умолчанию используется режим сжатия «infer», поэтому путь, заканчивающийся на .gz, .zip, .bz2, .xz или .zst, автоматически распаковывается. URLИспользование протоколов http, ftp, s3, gs или file — все работает, а storage_options передает учетные данные на удаленный бэкэнд.

Обученные модели выявляют вероятные ошибки типов, группируют почти идентичные написания категорий и заполняют пропущенные значения из окружающих столбцов. Это сужает область ручной очистки до строк, которые правило na_values ​​или параметр dtype не могут обработать самостоятельно.

Copilot быстро создает черновой вариант кода, как только видит образец файла. Рассматривайте список аргументов как черновик, поскольку он часто угадывает тип данных и кодировку. Перед запуском проверяйте каждое сгенерированное ключевое слово по справочнику API pandas.

Подведем итог этой публикации следующим образом: