Изменение значений в DataFrame Pandas: 3 эффективных метода
Для кого эта статья:
- Python-разработчики, стремящиеся улучшить навыки работы с библиотекой Pandas
- Студенты и начинающие аналитики данных, которые хотят узнать о манипуляциях с данными
Профессионалы в области анализа данных, ищущие эффективные методы изменения значений в DataFrame
Манипуляция данными — фундаментальный навык для каждого Python-разработчика. Когда дело касается изменения значений в DataFrame Pandas, многие застревают в попытках понять синтаксис или выбрать оптимальный метод. Безусловно, существуют элегантные и эффективные способы обновления ячеек без мучительных проб и ошибок. Сегодня мы препарируем три ключевых подхода к изменению значений, которые сэкономят вам часы отладки и превратят хаотичный код в стройную симфонию работы с данными. 🐼
Хотите превратить базовые знания Pandas в востребованные навыки профессионала? Обучение Python-разработке от Skypro погружает вас в реальные проекты, где манипуляция данными — лишь верхушка айсберга. На курсе вы освоите не только редактирование DataFrame, но и создание полноценных веб-приложений с использованием Python. Инвестируйте в навыки, которые действительно ценятся на рынке.
Основные методы изменения значений в DataFrame Pandas
Прежде чем погрузиться в технические детали, давайте создадим тестовый DataFrame, на котором будем демонстрировать различные методы изменения данных:
import pandas as pd
import numpy as np
# Создаем тестовый DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5],
'B': ['a', 'b', 'c', 'd', 'e'],
'C': [1\.1, 2.2, 3.3, 4.4, 5.5]
})
Этот DataFrame будет выглядеть следующим образом:
| Индекс | A | B | C |
|---|---|---|---|
| 0 | 1 | a | 1.1 |
| 1 | 2 | b | 2.2 |
| 2 | 3 | c | 3.3 |
| 3 | 4 | d | 4.4 |
| 4 | 5 | e | 5.5 |
В Pandas существуют три основных метода изменения значений в ячейках DataFrame:
- Индексирование через loc/iloc — использование метки или позиции для доступа и модификации ячеек
- Методы at/iat — оптимизированные для скорости методы изменения отдельных ячеек
- Условное изменение — массовое обновление ячеек на основе определенных критериев
Каждый из этих подходов имеет свои сильные стороны и лучше подходит для определенных сценариев. Рассмотрим их детально, чтобы вы могли выбрать наиболее подходящий инструмент для своей задачи. 🛠️

Изменение ячеек с помощью loc и iloc в Pandas
Антон Зверев, Lead Data Scientist
Однажды я столкнулся с проблемой при работе с финансовым датасетом. Мне нужно было срочно исправить некорректные значения, но я не мог вспомнить правильный синтаксис для обращения к ячейкам. Потратив полчаса на пробы и ошибки, я наконец понял разницу между loc и iloc. Loc работает с метками (названиями) строк и столбцов, а iloc — с числовыми индексами. После этого озарения процесс пошел как по маслу. Теперь эти два инструмента — первое, чему я обучаю новых аналитиков в команде.
Методы loc и iloc — это самые универсальные инструменты для работы с ячейками DataFrame в Pandas. Они позволяют точно указать, какую ячейку вы хотите изменить, используя либо метки строк и столбцов (loc), либо позиционные индексы (iloc).
Использование loc для изменения ячеек
Метод loc позволяет обращаться к ячейкам по меткам строк и столбцов. Это особенно удобно, когда ваш DataFrame имеет нестандартные индексы:
# Изменение значения в ячейке на пересечении строки с индексом 2 и столбца 'B'
df.loc[2, 'B'] = 'изменено'
print(df)
Этот код заменит значение 'c' на 'изменено' в третьей строке столбца B.
Вы также можете использовать loc для изменения нескольких ячеек одновременно:
# Изменение всех значений в столбце 'A' для строк с индексами 0 и 1
df.loc[[0, 1], 'A'] = 100
print(df)
Использование iloc для изменения ячеек
Метод iloc работает аналогично loc, но использует числовые позиции вместо меток. Первый аргумент — позиция строки, второй — позиция столбца:
# Изменение значения в ячейке на пересечении 1-й строки и 2-го столбца (индексы начинаются с 0)
df.iloc[1, 2] = 99.9
print(df)
Этот код изменит значение в ячейке на пересечении второй строки и третьего столбца (столбец C) с 2.2 на 99.9.
| Метод | Синтаксис | Когда использовать | Преимущества |
|---|---|---|---|
| loc | df.loc[меткастроки, меткастолбца] | Когда известны имена индексов и столбцов | Интуитивно понятен, работает с именами |
| iloc | df.iloc[позициястроки, позициястолбца] | Когда известны позиции элементов | Работает быстрее, не зависит от имен |
Оба метода позволяют также использовать срезы для изменения группы ячеек:
# Использование loc со срезами
df.loc[0:2, 'A':'B'] = 0 # Изменяет значения в первых трех строках и столбцах A и B
# Использование iloc со срезами
df.iloc[0:3, 0:2] = 0 # То же самое, но через позиции
Важно помнить, что при использовании loc границы среза включаются, а при использовании iloc правая граница исключается! 🔍
Применение at и iat для быстрого обновления данных
Когда требуется максимальная производительность при изменении отдельных ячеек, методы at и iat становятся незаменимыми. Они оптимизированы для работы с единичными ячейками и выполняются значительно быстрее, чем loc и iloc.
Метод at — скоростной доступ по меткам
Метод at обеспечивает быстрый доступ к отдельной ячейке по метке строки и столбца:
# Изменение значения с помощью at
df.at[3, 'C'] = 100.0
print(df)
Этот код изменит значение в ячейке на пересечении строки с индексом 3 и столбца 'C' с 4.4 на 100.0.
Метод iat — молниеносное изменение по позиции
Метод iat работает аналогично at, но использует целочисленные позиции:
# Изменение значения с помощью iat
df.iat[4, 0] = 500
print(df)
Этот код изменит значение в ячейке на пересечении 5-й строки и 1-го столбца (столбец A) с 5 на 500.
Важно понимать, что методы at и iat:
- Работают только с единичными ячейками (нельзя использовать срезы или списки индексов)
- Значительно быстрее для изменения отдельных ячеек, особенно в больших DataFrame
- Имеют более строгие требования к типам данных индексов
Когда стоит использовать at и iat?
- В циклах, где происходит последовательное изменение отдельных ячеек
- При работе с большими DataFrame, где производительность критична
- Когда требуется изменить только одну конкретную ячейку
# Пример использования at в цикле
for i in range(len(df)):
df.at[i, 'A'] = i * 10
Этот простой цикл будет работать значительно быстрее с at, чем с loc, особенно на больших объемах данных. 🚀
Массовое изменение ячеек с помощью условий и методов
Марина Соколова, Data Engineer
В проекте по анализу клиентских данных мне пришлось обрабатывать таблицу с миллионами строк, где требовалось заменить все отрицательные значения продаж на нули. Изначально я пыталась использовать циклы с loc, что приводило к ужасной производительности — скрипт работал часами. После консультации с коллегами я перешла на векторизованный подход с использованием условных масок. Это сократило время выполнения до нескольких секунд! С тех пор я всегда использую векторизованные операции для массовых изменений данных и рекомендую это всем, кто работает с большими датасетами.
Когда требуется изменить множество ячеек на основе определенных условий, использование индексаторов по отдельности становится неэффективным. Pandas предлагает векторизованные операции, которые позволяют применять изменения массово и с высокой производительностью. 📊
Использование условных масок
Наиболее мощный подход к массовому изменению ячеек — использование булевых масок:
# Создаем новый DataFrame для демонстрации
df_demo = pd.DataFrame({
'Значения': [10, -5, 20, -15, 30],
'Категория': ['A', 'B', 'A', 'C', 'B']
})
# Заменяем все отрицательные значения на 0
df_demo.loc[df_demo['Значения'] < 0, 'Значения'] = 0
print(df_demo)
Результат выполнения кода:
| Индекс | Значения | Категория |
|---|---|---|
| 0 | 10 | A |
| 1 | 0 | B |
| 2 | 20 | A |
| 3 | 0 | C |
| 4 | 30 | B |
Можно комбинировать несколько условий для более сложной фильтрации:
# Заменяем значения для строк, где Категория='B' и Значения>0
df_demo.loc[(df_demo['Категория'] == 'B') & (df_demo['Значения'] > 0), 'Значения'] = 100
print(df_demo)
Использование метода replace
Для замены конкретных значений по всему DataFrame или в отдельном столбце удобно использовать метод replace:
# Заменяем категорию 'A' на 'Premium'
df_demo['Категория'] = df_demo['Категория'].replace('A', 'Premium')
print(df_demo)
Метод replace также позволяет заменять несколько значений одновременно:
# Заменяем несколько категорий
df_demo['Категория'] = df_demo['Категория'].replace({'B': 'Standard', 'C': 'Basic'})
print(df_demo)
Применение функций с методом apply
Для более сложных преобразований можно применять пользовательские функции с помощью метода apply:
# Определяем функцию преобразования
def transform_value(x):
if x > 0 and x < 50:
return x * 2
else:
return x
# Применяем функцию к столбцу 'Значения'
df_demo['Значения'] = df_demo['Значения'].apply(transform_value)
print(df_demo)
Метод apply может также применяться к строкам или ко всему DataFrame, если передать соответствующую ось:
# Применяем функцию к строкам DataFrame
def process_row(row):
if row['Категория'] == 'Standard':
row['Значения'] += 5
return row
df_demo = df_demo.apply(process_row, axis=1)
print(df_demo)
Векторизованные операции всегда предпочтительнее циклов при работе с Pandas, так как они выполняются значительно быстрее и делают код более читаемым. 💻
Практические задачи и решения для работы с ячейками DataFrame
Теория без практики мертва, поэтому давайте рассмотрим несколько реальных сценариев, с которыми вы можете столкнуться при работе с данными, и разберем их решения с использованием изученных методов.
Задача 1: Обработка отсутствующих значений
Часто в реальных данных встречаются пропуски (NaN), которые необходимо обрабатывать определенным образом:
# Создаем DataFrame с пропусками
df_missing = pd.DataFrame({
'Имя': ['Иван', 'Мария', 'Алексей', 'Елена', 'Сергей'],
'Возраст': [25, np.nan, 42, 30, np.nan],
'Зарплата': [50000, 60000, np.nan, 70000, 55000]
})
# Заменяем пропуски в столбце 'Возраст' на среднее значение
mean_age = df_missing['Возраст'].mean()
df_missing.loc[df_missing['Возраст'].isna(), 'Возраст'] = mean_age
# Заменяем пропуски в столбце 'Зарплата' на медианное значение
median_salary = df_missing['Зарплата'].median()
df_missing.loc[df_missing['Зарплата'].isna(), 'Зарплата'] = median_salary
print(df_missing)
Задача 2: Нормализация данных
Предположим, нам нужно нормализовать числовые данные, приведя их к диапазону от 0 до 1:
# Создаем DataFrame с числовыми данными
df_nums = pd.DataFrame({
'A': [10, 20, 30, 40, 50],
'B': [100, 200, 300, 400, 500]
})
# Нормализуем столбец 'A'
min_a = df_nums['A'].min()
max_a = df_nums['A'].max()
df_nums['A_norm'] = (df_nums['A'] – min_a) / (max_a – min_a)
# Нормализуем столбец 'B'
min_b = df_nums['B'].min()
max_b = df_nums['B'].max()
df_nums['B_norm'] = (df_nums['B'] – min_b) / (max_b – min_b)
print(df_nums)
Задача 3: Категоризация непрерывных данных
Часто требуется преобразовать непрерывные числовые данные в категории:
# Создаем DataFrame с возрастом
df_age = pd.DataFrame({
'Имя': ['Иван', 'Мария', 'Алексей', 'Елена', 'Сергей', 'Анна', 'Павел'],
'Возраст': [25, 32, 47, 19, 58, 41, 36]
})
# Создаем функцию категоризации
def categorize_age(age):
if age < 30:
return 'Молодой'
elif 30 <= age < 45:
return 'Средний'
else:
return 'Старший'
# Применяем функцию для создания новой колонки
df_age['Возрастная_группа'] = df_age['Возраст'].apply(categorize_age)
print(df_age)
Задача 4: Обработка дубликатов
Иногда требуется идентифицировать и обработать дублирующиеся записи:
# Создаем DataFrame с дубликатами
df_dupes = pd.DataFrame({
'ID': [1, 2, 2, 3, 4, 4, 5],
'Значение': [10, 20, 25, 30, 40, 45, 50]
})
# Находим дублирующиеся ID
duplicated_ids = df_dupes[df_dupes.duplicated('ID', keep=False)]
# Для каждого дублирующегося ID выбираем запись с максимальным значением
for id_val in duplicated_ids['ID'].unique():
# Находим индексы всех записей с текущим ID
id_indices = df_dupes[df_dupes['ID'] == id_val].index
# Находим индекс записи с максимальным значением
max_value_idx = df_dupes.loc[id_indices, 'Значение'].idxmax()
# Для всех записей с текущим ID, кроме той, что имеет максимальное значение,
# помечаем как 'Дубликат'
for idx in id_indices:
if idx != max_value_idx:
df_dupes.at[idx, 'Статус'] = 'Дубликат'
else:
df_dupes.at[idx, 'Статус'] = 'Основная'
print(df_dupes)
Эти практические примеры демонстрируют, как различные методы изменения ячеек могут применяться для решения реальных задач обработки данных. Выбор конкретного подхода зависит от сложности задачи, размера данных и требований к производительности. 📈
Освоение методов изменения данных в Pandas — это не просто техническое умение, а стратегический инструмент для эффективного анализа информации. Выбирайте правильный метод исходя из контекста задачи: используйте loc/iloc для гибкой работы с диапазонами данных, at/iat для максимальной производительности при точечных изменениях, и векторизованные операции для массовых преобразований. Помните, что каждая манипуляция с данными — это шаг к более глубокому пониманию информации, которая скрывается за цифрами и текстом в ваших таблицах.