Таблицы pandas: от загрузки до продвинутого анализа

Раздел: Анализ данных -> Работа с 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 может возникнуть ошибка. Решение - установить библиотеку.

Таблица pandas в Python - comments

En
Pandas python таблица (python)