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-пайплайном.