Новое Распределяем каналы MAX по категориям и территориям. Читать новость

📏 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: int64


y — это 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. Сортировка и фильтрация
Просмотры: 228
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти