← Назад к вопросам

В чём отличие между Series и DataFrame в Pandas?

1.2 Junior🔥 161 комментариев
#Pandas и обработка данных#Python и программирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Series vs DataFrame в Pandas

Series и DataFrame — это основные структуры данных в Pandas. Series — это одномерный массив, а DataFrame — это двумерная таблица. Понимание их различий критично для работы с данными в Python.

Что такое Series?

Series — это одномерный индексированный массив данных. Можешь думать о нём как о одном столбце в Excel или одном векторе.

import pandas as pd

# Создание Series
salaries = pd.Series([50000, 60000, 55000, 70000], 
                     index=['Alice', 'Bob', 'Charlie', 'David'])

print(salaries)
# Alice     50000
# Bob       60000
# Charlie   55000
# David     70000
# dtype: int64

print(type(salaries))  # <class 'pandas.core.series.Series'>

Характеристики Series:

  • Одномерная (один столбец)
  • Имеет индекс (index) и значения (values)
  • Каждый элемент имеет метку (label)
  • Может содержать разные типы данных (int, str, float, object)

Что такое DataFrame?

DataFrame — это двумерная таблица данных, как электронная таблица Excel или SQL таблица. Это набор Series с одинаковым индексом.

# Создание DataFrame
employees = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'salary': [50000, 60000, 55000, 70000],
    'department': ['Sales', 'IT', 'HR', 'Sales']
})

print(employees)
#      name  salary department
# 0   Alice   50000      Sales
# 1     Bob   60000        IT
# 2 Charlie   55000        HR
# 3   David   70000      Sales

print(type(employees))  # <class 'pandas.core.frame.DataFrame'>

Характеристики DataFrame:

  • Двумерная (строки и столбцы)
  • Имеет индекс (row index), колонки (columns) и значения
  • Каждая колонка — это Series
  • Похож на SQL таблицу или Excel лист

Таблица сравнения

ПараметрSeriesDataFrame
Размерность1D (одномерная)2D (двумерная)
ИндексRow indexRow index + Column names
АналогияОдин столбец в ExcelВесь лист Excel
Аналогия (БД)Один атрибутВся таблица
Тип данныхОдин для всех элементовРазные в каждой колонке
Селекцияs[0] или s['label']df['col'] или df.loc[row]
Форма(n,)(n, m)

Взаимоотношение

DataFrame состоит из Series!

# Каждая колонка DataFrame — это Series
print(type(employees['salary']))   # <class 'pandas.core.series.Series'>
print(employees['salary'])         # Series с 4 значениями

# Каждая строка DataFrame — это Series
print(type(employees.iloc[0]))     # <class 'pandas.core.series.Series'>
print(employees.iloc[0])           # Series с 3 значениями (name, salary, department)

Создание и базовые операции

Series из списка:

# Простой способ
scores = pd.Series([85, 90, 78, 92])

# С кастомным индексом
scores = pd.Series([85, 90, 78, 92], 
                   index=['Math', 'English', 'Science', 'History'])

# С именем
scores.name = 'Test Scores'
print(scores.name)  # 'Test Scores'

DataFrame из словаря:

# Из словаря, где ключи — колонки
data = {
    'age': [25, 30, 35, 40],
    'salary': [50000, 60000, 70000, 80000],
    'city': ['NYC', 'LA', 'Chicago', 'Boston']
}
df = pd.DataFrame(data)

# Из списка словарей
data = [
    {'name': 'Alice', 'age': 25},
    {'name': 'Bob', 'age': 30}
]
df = pd.DataFrame(data)

Селекция данных

Series:

salaries = pd.Series([50000, 60000, 55000, 70000], 
                     index=['Alice', 'Bob', 'Charlie', 'David'])

# По позиции (iloc)
print(salaries.iloc[0])      # 50000 (первый элемент)
print(salaries.iloc[0:2])    # Series с Alice и Bob

# По метке (loc)
print(salaries.loc['Bob'])   # 60000
print(salaries['Bob'])       # 60000 (сокращённо)

# Фильтрация
high_earners = salaries[salaries > 55000]  # 60000, 70000

DataFrame:

# Выбрать одну колонку (возвращает Series)
df['salary']  # или df.salary

# Выбрать несколько колонок (возвращает DataFrame)
df[['name', 'salary']]  # Двойные скобки!

# Выбрать строку по индексу
df.iloc[0]   # Первая строка
df.loc[0]    # Строка с индексом 0

# Фильтрация
df[df['salary'] > 55000]  # Строки, где salary > 55000

# Условное выбора
df.loc[df['department'] == 'Sales']

Операции

Series операции:

salaries = pd.Series([50000, 60000, 55000, 70000])

# Математические операции
print(salaries + 5000)       # Все значения + 5000
print(salaries * 1.1)        # Все значения * 1.1

# Агрегирование
print(salaries.sum())        # 235000
print(salaries.mean())       # 58750
print(salaries.max())        # 70000
print(salaries.min())        # 50000
print(salaries.describe())   # Статистика

DataFrame операции:

df = pd.DataFrame({
    'salary': [50000, 60000, 55000, 70000],
    'bonus': [5000, 6000, 5500, 7000]
})

# По колонкам
print(df.sum())      # Сумма по каждой колонке
print(df.mean())     # Среднее по каждой колонке

# По строкам
print(df.sum(axis=1))  # Сумма по каждой строке

# Применить функцию
df['total'] = df['salary'] + df['bonus']

# Трансформация
df_scaled = (df - df.mean()) / df.std()  # Стандартизация

Практические примеры

Пример 1: Работа с Series

import pandas as pd

# Логирование показателей за месяц
revenue_by_day = pd.Series({
    'Monday': 1000,
    'Tuesday': 1200,
    'Wednesday': 950,
    'Thursday': 1100,
    'Friday': 1300
})

# Анализ
print(f"Средний доход: {revenue_by_day.mean()}")  # 1110
print(f"Максимум: {revenue_by_day.max()}")       # 1300
best_day = revenue_by_day.idxmax()                # 'Friday'
print(f"Лучший день: {best_day}")

Пример 2: DataFrame для анализа

# Данные о продажах
sales_data = pd.DataFrame({
    'date': pd.date_range('2024-01-01', periods=5),
    'product': ['A', 'B', 'A', 'C', 'B'],
    'quantity': [10, 15, 8, 20, 12],
    'price': [100, 50, 100, 30, 50]
})

# Добавить колонку с суммой
sales_data['total'] = sales_data['quantity'] * sales_data['price']

# Группировка
sales_by_product = sales_data.groupby('product')['total'].sum()
# A: 1800
# B: 1200
# C: 600

# Объединение с DataFrame
print(sales_data.merge(
    sales_by_product.to_frame(name='product_total'),
    left_on='product', right_index=True
))

Пример 3: Преобразование Series в DataFrame и наоборот

# Series в DataFrame
series = pd.Series([1, 2, 3, 4], name='values')
df = series.to_frame()  # Создаст DataFrame с одной колонкой

# DataFrame в Series
df = pd.DataFrame({'col1': [1, 2, 3]})
ds = df['col1']  # Вернёт Series

# Много Series в DataFrame
s1 = pd.Series([1, 2, 3], name='col1')
s2 = pd.Series([4, 5, 6], name='col2')
df = pd.concat([s1, s2], axis=1)  # Объединить в DataFrame

Итог

  • Series — одномерный массив для работы с одной колонкой
  • DataFrame — двумерная таблица для работы с несколькими колонками
  • DataFrame состоит из Series — каждая колонка это Series
  • В аналитике чаще работаешь с DataFrame, но Series важна для отдельных колонок и операций