PandasJuniorTechnical

В чём разница между Series и DataFrame в Pandas?

Series — одномерная структура (один столбец с индексом), DataFrame — двумерная таблица (набор Series, разделяющих общий индекс). Series — строительный блок DataFrame.

Series и DataFrame: ключевые отличия

Оба объекта являются основными структурами данных Pandas и построены на NumPy ndarray. Разница — в размерности и способе доступа к данным.

Series — одномерная структура

Series хранит последовательность значений одного типа и именованный индекс. Аналог столбца в таблице или именованного массива.

import pandas as pd

# Создание Series
s = pd.Series([10, 20, 30, 40], index=["a", "b", "c", "d"], name="score")
print(s)
# a    10
# b    20
# c    30
# d    40
# Name: score, dtype: int64

print(s["b"])    # 20  — доступ по метке
print(s.iloc[1]) # 20  — доступ по позиции
print(s.dtype)   # int64
print(s.name)    # score

DataFrame — двумерная таблица

DataFrame — набор Series с общим индексом. Каждый столбец — отдельная Series. Аналог таблицы в реляционной БД или листа Excel.

df = pd.DataFrame({
    "name": ["Alice", "Bob", "Charlie"],
    "age": [25, 30, 35],
    "salary": [80000, 95000, 110000],
})
print(df)
#       name  age  salary
# 0    Alice   25   80000
# 1      Bob   30   95000
# 2  Charlie   35  110000

print(df.shape)          # (3, 3)
print(df.dtypes)         # типы по столбцам
print(df["age"])         # Series
print(type(df["age"]))   # <class 'pandas.core.series.Series'>

Взаимосвязь

# Столбец DataFrame — это Series
col: pd.Series = df["salary"]
print(col.name)   # salary

# Series можно создать из одного столбца DataFrame
s2 = df["age"].rename("years")

# DataFrame можно создать из словаря Series
df2 = pd.DataFrame({"x": pd.Series([1, 2, 3]), "y": pd.Series([4, 5, 6])})

# Одностолбцовый DataFrame != Series
df_single = df[["age"]]   # DataFrame с одним столбцом, shape=(3,1)
series_age = df["age"]    # Series, shape=(3,)

Основные различия в API

  • Series: .values, .index, .name, .str, .dt — операции над одной колонкой.
  • DataFrame: .columns, .dtypes, .loc[rows, cols], .iloc[rows, cols] — двумерная индексация.
  • Математические операции над Series выравниваются по индексу автоматически; у DataFrame — по индексу и столбцам.
  • df.apply(func, axis=0) применяет функцию к каждому столбцу (Series); axis=1 — к каждой строке (Series).

Подводные камни

  • df["col"] возвращает Series, df[["col"]] — DataFrame с одним столбцом; методы у них разные.
  • Операция между двумя Series выравнивает по индексу — если индексы не совпадают, получаете NaN там, где нет пересечения.
  • У Series есть атрибут .name, у DataFrame нет; при конвертации Series в DataFrame имя становится заголовком столбца.
  • Присвоение нового столбца в DataFrame (df["new"] = series) тоже выравнивает по индексу — несовпадающие строки дают NaN.
  • df.values возвращает numpy array со смешанным dtype (object), если типы столбцов различаются — неожиданно для числовых вычислений.

Common mistakes

  • Объяснять series vs dataframe только синтаксисом без shape, dtype, состояния или режима выполнения.
  • Игнорировать leakage, воспроизводимость, пустые входы и скрытые копии данных.
  • Не проверять production-симптомы: latency, память, ретраи, дрейф качества и несовпадение версий.

What the interviewer is testing

  • Может ли связать series vs dataframe с реальным контрактом входов и выходов.
  • Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
  • Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.

Sources

Related topics

В чём разница между `Series` и `DataFrame` в Pandas? | Talanto