📏 Pandas: меняем размер таблицы — добавляем и удаляем данные
Сегодня разбираем, как менять размер таблицы: добавлять и удалять строки и столбцы.
🤝 Фиксированная длина
Series и DataFrame в Pandas имеют фиксированную длину. Нельзя просто взять и добавить новую строку к существующему объекту — нужно создавать новый объект, объединяя старый с новыми данными.Почему?
Pandas внутри использует неизменяемые массивы NumPy — менять размер без копирования нельзя. Это жертва ради скорости и памяти.
➕ Добавление строк
Чтобы добавить одну или несколько строк, используют функцию
pd.concat(). Старый метод .append() устарел.import pandas as pd
# Исходный DF
df = pd.DataFrame({'город': ['Москва', 'СПб'],
'нас.млн': [13.27, 5.65]})
# Создаём новые строки как DF (любое кол-во)
new_rows = pd.DataFrame({'город': ['Саратов', 'Нск'],
'нас.млн': [0.89, 1.63]})
# Объединяем (новая копия!)
df_new = pd.concat([df, new_rows], ignore_index=True)- ignore_index=True переиндексирует результат (0,1,2…), иначе индекс останется старым.
➕ Добавление столбцов
Добавить новый столбец проще — он не меняет длину таблицы. Просто добавляем столбец с новым именем.
Новый столбец всегда будет той же длины, что и DataFrame. ⚠️ Длина списка должна совпадать с числом строк (иначе ошибка).
На практике такая задача бывает редко, чаще создаём столбцы с константой, векторизованными вычислениями и сложной функцией .apply() — Pandas автоматически выдаст результат той же длины.
# + столбец с константойdf['порог_миллионника'] = 1.0
# + столбец, вычисленный из существующих
df['миллионник'] = df['нас.млн'] >= 1.0 # True для городов-миллионников (Москва, СПб, Нск), False для Саратова
⚠️ При добавлении столбца Pandas автоматически выравнивает данные по индексу, если присваивается Series.
❌ Три способа удалить данные и один — отфильтровать
1. Метод drop — гибкое удаление
- имеет параметр
axis: удаляет строки (axis=0) или столбцы (axis=1)- по умолчанию возвращает новый
DataFrame (новую копию), не меняя исходный- чтобы изменить исходный
DataFrame → используйте inplace=True- чтобы сохранить новый
DataFrame → присвойте результат переменной⚠️
inplace=True изменяет исходный объект и возвращает None 🤯# без присваивания — результат пропадёт
df.drop('город', axis=1) # ⚠️ вернул новый DF, но никуда не записали → потеряли
# с присваиванием — когда исходные данные ещё пригодятся
df2 = df.drop('город', axis=1) # исходный df остаётся нетронутым
# перезаписываем ту же переменную — когда исходный больше не нужен
df = df.drop('город', axis=1)2. Метод pop — вырезать столбец и вернуть его
- меняет исходный
DataFrame сразу (без inplace)- возвращает удалённый столбец как
Series (не DataFrame!)- удобен для отделения целевой переменной (y) от признаков (X)
y = df.pop('target') # target удаляется из df и сохраняется в y
X = df # то, что осталосьПример:
df = pd.DataFrame({'a': [1, 2, 3],
'b': [4, 5, 6],
'target': [7, 8, 9]})
y = df.pop('target') # вырезаем колонку 'target'
print(df)
# a b
# 0 1 4
# 1 2 5
# 2 3 6
print(y)
# 0 7
# 1 8
# 2 9
# Name: target, dtype: int64y — это
Series. Если нужен DataFrame из одного столбца, используйте .to_frame().3. Оператор del — встроенный в Python (не метод Pandas)
del df['column'] # удаляет столбец, меняет исходный DataFrame
В аналитике
del используют редко — .drop() и .pop() удобнее и нагляднее.4. Удаление через фильтрацию
Создаётся новый
DataFrame только с нужными строками (исходный не меняется).# оставляем строки, где численность > 1 млн
df_filtered = df[df['нас.млн'] > 1]
print(df_filtered)❗️ Производительность
Создание новых объектов (через
concat, drop и т.д.) занимает время и память. Для больших данных лучше минимизировать.💬 Далее:
Pandas. Сортировка и фильтрация