</>
Topic 2 of 7

Course materials are currently available in Russian only.

DataFrame и чтение CSV

DataFrame — это таблица: несколько Series с общим индексом. Каждый столбец — Series со своим именем и типом данных. С DataFrame работают аналитики, исследователи данных и все, кто готовит данные для машинного обучения.

Создание таблицы

import pandas as pd

df = pd.DataFrame({
    "город": ["Казань", "Пермь", "Тверь"],
    "население": [1300, 1000, 400],
    "регион": ["ПФО", "ПФО", "ЦФО"],
})
print(df)
    город  население регион
0  Казань       1300    ПФО
1   Пермь       1000    ПФО
2   Тверь        400    ЦФО

Слева — индекс строк (по умолчанию 0, 1, 2, …), сверху — названия столбцов.

Чтение CSV

На практике таблицы не набирают вручную, а читают из файлов. Самый распространённый формат — CSV (comma-separated values): первая строка — названия столбцов, дальше строки данных через запятую.

город,население,регион
Казань,1300,ПФО
Пермь,1000,ПФО
df = pd.read_csv("cities.csv")       # из файла

read_csv сам определяет типы столбцов: числа станут числами, остальное — строками. У функции много параметров: sep=";" — другой разделитель, header=None — если заголовка нет, usecols=[...] — читать только часть столбцов.

В задачах таблица приходит во входных данных — её можно читать прямо оттуда:

import sys
df = pd.read_csv(sys.stdin)

Первый взгляд на данные

print(df.shape)         # (3, 3) — строк, столбцов
print(df.columns)       # названия столбцов
print(df.dtypes)        # тип каждого столбца
print(df.head(2))       # первые 2 строки
print(df.tail(1))       # последняя строка
print(df.describe())    # статистики по числовым столбцам

len(df) — количество строк.

Столбцы

Столбец достаётся по имени — получается Series:

pop = df["население"]
print(pop.sum(), pop.max())

Несколько столбцов — списком имён, получается таблица:

small = df[["город", "регион"]]

Перебрать все столбцы: for col in df.columns: ...

Новые столбцы

Новый столбец создаётся присваиванием. Вычисления идут построчно, как у массивов numpy:

df["население_млн"] = df["население"] / 1000
df["крупный"] = df["население"] > 1000

Удалить столбец: df = df.drop(columns=["крупный"]).

Строки

Строку по номеру позиции берут через iloc, по подписи индекса — через loc:

print(df.iloc[0])          # первая строка — Series с подписями-столбцами
print(df.iloc[0]["город"]) # Казань
print(df.loc[2, "город"])  # Тверь — строка с индексом 2, столбец «город»

Строка с максимальным значением в столбце — через idxmax:

top = df.loc[df["население"].idxmax()]
print(top["город"])        # Казань

Перебор строк

for i, row in df.iterrows():
    print(row["город"], row["население"])

iterrows медленный, на больших таблицах лучше обходиться операциями над столбцами. Если перебор всё-таки нужен, быстрее zip(df["город"], df["население"]).

Итог

  • pd.DataFrame(словарь) — таблица; pd.read_csv(файл или sys.stdin) — чтение CSV;
  • shape, columns, dtypes, head, describe — первый взгляд;
  • df["столбец"] — Series, df[["a", "b"]] — таблица;
  • df["новый"] = выражение — новый столбец;
  • iloc — по позиции, loc — по подписи; idxmax — подпись строки с максимумом.