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— подпись строки с максимумом.