Таблицы pandas: от загрузки до продвинутого анализа
Работа с таблицами pandas: создание и основные операции
Самый распространенный способ создать таблицу DataFrame - использовать словарь, где ключи становятся названиями столбцов, а значения - списками с данными. Этот метод интуитивно понятен и подходит для небольших наборов данных, которые формируются в коде.
import pandas as pd
data = {
'Товар': ['Ноутбук', 'Мышь', 'Клавиатура'],
'Цена': [55000, 1500, 3000],
'Количество': [10, 50, 25]
}
df = pd.DataFrame(data)
print(df)Pandas python таблица (таблица pandas в python)
Товар Цена Количество 0 Ноутбук 55000 10 1 Мышь 1500 50 2 Клавиатура 3000 25
Пояснение: функция pd.DataFrame() принимает словарь и автоматически выравнивает данные по индексу. Если списки разной длины, возникнет ошибка ValueError - это типичная проблема. Решение - убедиться, что все списки имеют одинаковую длину, или использовать заполнение пропусков.
Как загрузить таблицу из CSV файла?
Для работы с внешними данными чаще всего применяется pd.read_csv(). Функция читает текстовый файл, где строки разделены переносом, а столбцы - запятыми (или другим разделителем).
df_csv = pd.read_csv('sales.csv', delimiter=';', encoding='utf-8')
print(df_csv.head(3))
Проблемы: неверная кодировка (например, cp1251 вместо utf-8) приводит к кракозябрам. Решение - указать правильный параметр encoding. Также если в файле нет заголовков, нужно добавить header=None.
Как прочитать данные из Excel?
Функция pd.read_excel() загружает листы Excel-файла. Требуется библиотека openpyxl или xlrd.
df_excel = pd.read_excel('report.xlsx', sheet_name='Лист1', engine='openpyxl')
print(df_excel.columns.tolist())
Ошибка возникает, если файл отсутствует или используется неподдерживаемое расширение. Рекомендуется указывать engine явно для современных .xlsx.
Как создать таблицу из списка списков?
Когда данные представлены в виде вложенных списков (строки - списки, первый список - заголовки), удобно передать их в pd.DataFrame() с параметром columns.
rows = [
['Иван', 25, 1500],
['Петр', 30, 2000],
['Сергей', 28, 1800]
]
df_list = pd.DataFrame(rows, columns=['Имя', 'Возраст', 'Зарплата'])
print(df_list)
Имя Возраст Зарплата 0 Иван 25 1500 1 Петр 30 2000 2 Сергей 28 1800
Проблема: если количество столбцов не совпадает с длиной списков, возникает ошибка AssertionError. Решение - выровнять данные.
Как объединить несколько Series в одну таблицу?
Объекты Series можно объединить, передав словарь, где ключи - названия столбцов, а значения - сами Series. Индексы автоматически выравниваются.
s1 = pd.Series([10, 20, 30], name='A')
s2 = pd.Series([40, 50, 60], name='B')
df_series = pd.DataFrame({'A': s1, 'B': s2})
print(df_series)
A B 0 10 40 1 20 50 2 30 60
Проблема: если индексы не совпадают, возникает NaN. Решение - использовать reset_index() или объединение через pd.concat().
Как импортировать данные из JSON?
pd.read_json() принимает строку JSON или путь к файлу. По умолчанию ожидается ориентация «records» (список словарей).
import json
data_json = '[{"a":1,"b":2},{"a":3,"b":4}]'
df_json = pd.read_json(data_json)
print(df_json)
a b 0 1 2 1 3 4
Проблема: неверная структура JSON (например, вложенные объекты) приводит к ошибке парсинга. Решение - использовать json_normalize() для вложенных структур.
Как получить таблицу из базы данных SQL?
Функция pd.read_sql() выполняет SQL-запрос и возвращает DataFrame. Требуется подключение через sqlalchemy или sqlite3.
from sqlalchemy import create_engine
engine = create_engine('sqlite:///mydb.db')
df_sql = pd.read_sql('SELECT * FROM employees', engine)
print(df_sql.shape)
Проблема: медленная работа с большими таблицами. Решение - использовать чанки (chunksize) или индексы.
Типичная ошибка: при создании DataFrame из словаря часто забывают, что все значения должны быть коллекциями одинаковой длины. Если один из столбцов - скаляр, он будет расширен на всю длину. Но если длина списков разная, возникает ValueError: arrays must all be same length. Чтобы избежать, используют pd.Series с автоматическим заполнением пропусков или добавляют fillna.
Расширенные примеры работы с таблицами pandas
Фильтрация строк по условию
Выбрать строки, где цена больше 2000.
df = pd.DataFrame({'Товар': ['A','B','C'], 'Цена': [1000, 3000, 500], 'Количество': [10,5,15]})
filtered = df[df['Цена'] > 2000]
print(filtered)
Товар Цена Количество 1 B 3000 5
Можно комбинировать условия через & и |.
Выбор столбцов и добавление нового
print(df[['Товар', 'Количество']]) # два столбца
df['Общая стоимость'] = df['Цена'] * df['Количество']
print(df)
Товар Количество 0 A 10 1 B 5 2 C 15 Товар Цена Количество Общая стоимость 0 A 1000 10 10000 1 B 3000 5 15000 2 C 500 15 7500
Применение функций к столбцам (apply / map)
df['Цена со скидкой'] = df['Цена'].apply(lambda x: x * 0.9)
print(df[['Цена', 'Цена со скидкой']])
Цена Цена со скидкой 0 1000 900.0 1 3000 2700.0 2 500 450.0
map подходит для замены значений по словарю.
Группировка и агрегация
df_sales = pd.DataFrame({
'Город': ['Москва','СПб','Москва','СПб','Казань'],
'Продажи': [100,200,150,250,300],
'Месяц': [1,1,2,2,1]
})
grouped = df_sales.groupby('Город')['Продажи'].agg(['sum', 'mean'])
print(grouped)
sum mean Город Казань 300 300.0 Москва 250 125.0 СПб 450 225.0
Сводные таблицы (pivot_table)
pivot = df_sales.pivot_table(index='Город', columns='Месяц', values='Продажи', aggfunc='sum', fill_value=0)
print(pivot)
Месяц 1 2 Город Казань 300 0 Москва 100 150 СПб 200 250
Объединение таблиц (merge и concat)
df1 = pd.DataFrame({'id': [1,2], 'name': ['A','B']})
df2 = pd.DataFrame({'id': [1,3], 'salary': [50000, 60000]})
merged = pd.merge(df1, df2, on='id', how='left')
print(merged)
id name salary 0 1 A 50000.0 1 2 B NaN
Обработка пропусков
print(merged.fillna(0))
id name salary 0 1 A 50000.0 1 2 B 0.0
Работа с датами
df_dates = pd.DataFrame({'date': ['2023-01-01', '2023-02-15', '2023-03-20']})
df_dates['date'] = pd.to_datetime(df_dates['date'])
df_dates['month'] = df_dates['date'].dt.month
print(df_dates)
date month 0 2023-01-01 1 1 2023-02-15 2 2 2023-03-20 3
Сохранение таблицы
df.to_csv('output.csv', index=False, encoding='utf-8-sig')
df.to_excel('output.xlsx', sheet_name='Data', index=False)
Проблема: при сохранении в Excel без openpyxl может возникнуть ошибка. Решение - установить библиотеку.