Функция Pandas df.replace()

Распространённые функции Pandas


df.replace()Это функция в Pandas, используемая для замены данных в DataFrame.

Замена данных — распространённая операция при очистке данных,replace()Она может помочь заменить определённые значения новыми значениями и поддерживает несколько гибких методов, таких как замена одного значения, замена нескольких значений и замена с помощью регулярных выражений. Это очень полезно в таких сценариях, как обработка выбросов, унификация форматов данных и преобразование кодировок.


Базовый синтаксис и параметры

replace()Это метод DataFrame, вызываемый через оператор точки.для вызова.

Формат синтаксиса

DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')

Описание параметра

Параметр Type Обязательный Описание Значение по умолчанию
to_replace str, regex, list, dict, int, float, None Обязательный Значение, которое нужно заменить. Это может быть одно значение, список значений, словарь, регулярное выражение и т. д. Отсутствует
value scalar, dict, list, str, regex, None Optional Значение после замены. Еслиto_replaceесли это словарь, этот параметр можно опустить; если это не словарь, этот параметр обязателен. Отсутствует
inplace bool Optional Если он равенTrue, изменять исходный DataFrame напрямую, не возвращая новый объект; если этоFalse, возвращать новый DataFrame, исходные данные остаются неизменными. False
limit int Optional Укажите максимальное количество замен. Отсутствует
regex bool или str Optional Если он равенTrue, рассматриватьto_replaceкак регулярное выражение. False
method str Optional Когдаto_replaceИспользуется, когда это список.'pad'или'ffill'Обозначает заполнение вперед;'backfill'или'bfill'Обозначает заполнение назад. 'pad'

Описание возвращаемого значения

  • Возвращает новый DataFrame (еслиinplace=False), илиNone(еслиinplace=True)。
  • Указанные значения в возвращённом DataFrame были заменены.

Примеры

Давайте досконально освоим это на серии примеровreplace()использование.

Пример 1: Замена одного значения

Замените конкретное значение в DataFrame на новое значение.

Пример

import pandas as pd
import numpy as np

# Создайте DataFrame, содержащий дублирующиеся данные
data = {
    'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Чжао Лю'],
    'Отдел': ['Технологии', 'Маркетинг', 'Технологии', 'Marketing'],
    'Зарплата': [5000, 6000, 5500, 7000]
}
df = pd.DataFrame(data)

print(“Исходные данные:”)
print(df)
print("=" * 50)

# Замените 'technology' на 'R&D'
df_replaced = df.replace('Technology', R&D)

print("Заменённые данные:")
print(df_replaced)

Ожидаемый вывод:

原始数据:
    姓名  部门   薪资
0  张三  技术  5000
1  李四  市场  6000
2  王五  技术  5500
3  赵六  市场  7000
==================================================
替换后的数据:
    姓名   部门  薪资
0  张三  研发  5000
1  李四  市场  6000
2  王五  研发  5500
3  赵六  市场  7000

Анализ кода:

  1. В DataFrame есть две строки с отделом "Technology".
  2. Используйтеdf.replace('技术', '研发')чтобы заменить все "technology" на "R&D".
  3. Этот метод заменяет все совпадающие значения в DataFrame.

Пример 2: Замена нескольких значений один к одному

Используйте словарь, чтобы заменить несколько разных значений сразу.

Пример

import pandas as pd

# Создать DataFrame, содержащий данные для замены
data = {
    'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Чжао Лю'],
    'city': ['Пекин', 'Шанхай', 'Гуанчжоу', 'Shenzhen'],
    Уровень: ['A', 'B', 'A', 'C']
}
df = pd.DataFrame(data)

print(“Исходные данные:”)
print(df)
print("=" * 50)

# Использовать словарь для выполнения нескольких замен
replacements = {
    'Beijing': 'Beijing',
    'Shanghai': 'Shanghai',
    'Guangzhou': 'Guangzhou',
    'Shenzhen': 'Shenzhen',
    'A': 'Отличное',
    'B': Хороший,
    'C': 'Pass'
}
df_replaced = df.replace(replacements)

print("Заменённые данные:")
print(df_replaced)

Ожидаемый вывод:

原始数据:
    姓名  城市  等级
0  张三  北京   A
1  李四  上海   B
2  王五  广州   A
3  赵六  深圳   C
==================================================
替换后的数据:
    姓名   城市  等级
0  张三  北京市  优秀
1  李四  上海市  良好
2  王五  广州市  优秀
3  赵六  深圳市  及格

Анализ кода:

  • Используя словарьreplacements, мы можем указать несколько правил замены одновременно.
  • Этот метод очень эффективен, позволяя избежать множественных вызовов кreplace()。

Пример 3: Замена значений в определённом столбце

Вы можете заменять значения только в определённых столбцах, не затрагивая другие столбцы.

Пример

import pandas as pd

# Создать DataFrame
data = {
    'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Чжао Лю'],
    'Отдел': ['Технологии', 'Маркетинг', 'Технологии', 'Marketing'],
    Position: ['Technology', 'Marketing', 'Technology', 'Marketing']
}
df = pd.DataFrame(data)

print(“Исходные данные:”)
print(df)
print("=" * 50)

# Заменить "Technology" на "R&D" только в столбце "Department"
df_replaced = df.replace({'Department': 'Technology'}, R&D)

print(Данные после замены только в столбце Department:)
print(df_replaced)
print("=" * 50)

Вы также можете использовать вложенный словарь, чтобы применять разные правила замены к разным столбцам.
df_replaced2 = df.replace({'Department': {'Technology': R&D, 'Marketing': Sales}, Position: 'Technology'})

print("Данные после применения разных правил замены к разным столбцам:")
print(df_replaced2)

Ожидаемый вывод:

原始数据:
    姓名  部门  职位
0  张三  技术  技术
1  李四  市场  市场
2  王五  技术  技术
3  赵六  市场  市场
==================================================
只替换部门列后的数据:
    姓名   部门  职位
0  张三  研发  技术
1  李四  市场  市场
2  王五  研发  技术
3  赵六  市场  市场
==================================================
对不同列使用不同规则替换后的数据:
    姓名   部门  职位
0  张三  研发  研发
1  李四  销售  市场
2  王五  研发  研发
3  赵六  销售  市场

Анализ кода:

  • Использование{'department': 'Technology'}может заменять только значения в столбце "Department".
  • Вложенный словарь{'department': {'Technology': 'R&D'}}можно указать разные правила замены для разных столбцов.

Пример 4: Замена с использованием регулярных выражений

regex=TrueПараметр позволяет использовать регулярные выражения для замены, что очень полезно при обработке текста с сопоставлением по шаблону.

Пример

import pandas as pd

# Создать DataFrame, который нужно обработать с помощью регулярных выражений
data = {
    'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Чжао Лю'],
    Телефон: ['138-0000-0000', '139-1111-1111', '137-2222-2222', '136-3333-3333'],
    Remarks: [Normal, 'VIPclient', Normal, 'VIP customer']
}
df = pd.DataFrame(data)

print(“Исходные данные:”)
print(df)
print("=" * 50)

# Использовать регулярные выражения для замены разделителей в телефонных номерах
df_replaced = df.replace(to_replace=r'(d{3})-(d{4})-(d{4})', value=r'1****3', regex=True)

print(Данные после замены телефонных номеров (скрытие средних 4 цифр):)
print(df_replaced)
print("=" * 50)

# Заменить "VIP customer" в примечании (возможны различия в пробельных символах)
df_replaced2 = df.replace(to_replace=r'VIPs*Customers?', value='VIP', regex=True)

print(Данные после унификации VIP-примечаний:)
print(df_replaced2)

Ожидаемый вывод:

原始数据:
    姓名          电话        备注
0  张三  138-0000-0000       正常
1  李四  139-1111-1111   VIP客户
2  王五  137-2222-2222       正常
3  赵六  136-3333-3333  VIP 客户
==================================================
替换电话号码(隐藏中间4位)后的数据:
    姓名          电话  备注
0  张三  138****0000   正常
1  李四  139****1111  VIP客户
2  王五  137****2222   正常
3  赵六  136****3333  VIP 客户
==================================================
统一VIP备注后的数据:
    姓名          电话  备注
0  张三  138-0000-0000  正常
1  李四  139-1111-1111  VIP
2  王五  137-2222-2222  正常
3  赵六  136-3333-3333  VIP

Анализ кода:

  • В первом примере используется регулярное выражение(d{3})-(d{4})-(d{4})чтобы сопоставить формат телефонного номера и заменить его на1****3, скрывая средние 4 цифры.
  • Во втором примере используетсяVIPs*客户?чтобы сопоставлять оба формата "VIPclient" и "VIP client" и единообразно заменять их на "VIP".

Пример 5: Замена пропущенных значений NaN

replace()Его также можно использовать для замены пропущенных значенийNaN, что является распространённой операцией при очистке данных.

Пример

import pandas as pd
import numpy as np

# Создайте DataFrame с пропущенными значениями
data = {
    'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Чжао Лю'],
    'Age': [25, np.nan, 35, np.nan],
    'Salary': [5000, 6000, np.nan, 8000]
}
df = pd.DataFrame(data)

print("Исходные данные:")
print(df)
print("=" * 50)

# Замените NaN на 0
df_replaced = df.replace(np.nan, 0)

print("Данные после замены NaN на 0:")
print(df_replaced)
print("=" * 50)

# Замените NaN другими значениями, например "Unknown"
df_replaced2 = df.replace(np.nan, 'Unknown')

print("Данные после замены NaN на 'Unknown':")
print(df_replaced2)

Ожидаемый вывод:

原始数据:
    姓名   年龄    薪资
0  张三  25.0  5000.0
1  李四   NaN  6000.0
2  王五  35.0     NaN
3  赵六   NaN  8000.0
==================================================
将 NaN 替换为 0 后的数据:
    姓名   年龄  薪资
0  张三  25.0  5000
1  李四   0.0  6000
2  王五  35.0     0
3  赵六   0.0  8000
==================================================
将 NaN 替换为'未知'后的数据:
    姓名   年龄    薪资
0  张三  25.0  5000.0
1  李四  未知  6000.0
2  王五  35.0    未知
3  赵六  未知  8000.0

Пояснение к коду:

  • np.nanобозначает пропущенные значения. Вы можете использоватьreplace(np.nan, value)чтобы заменить их.
  • Выберите подходящее значение для замены пропущенных значений с учётом типа данных и бизнес-требований.

Пример 6: Числовая замена

Вы можете заменить числовые данные, чтобы выполнить стандартизацию данных или обработку выбросов.

Пример

import pandas as pd

# Создать DataFrame, содержащий выбросы
data = {
    'Студент': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Zhao Liu', 'Qian Qi'],
    'Балл': [85, 150, 78, 92, -10]  # 150 и -10 — выбросы
}
df = pd.DataFrame(data)

print("Исходные данные:")
print(df)
print("=" * 50)

# Заменить выбросы значениями в разумном диапазоне
df_replaced = df.replace({150: 100, -10: 0})

print("Данные после замены выбросов:")
print(df_replaced)
print("=" * 50)

# Использовать условную логику для замены нескольких значений
df_replaced2 = df.replace(to_replace=[150, -10], value=[100, 0])

print("Использование списков для замены нескольких значений:")
print(df_replaced2)

Ожидаемый вывод:

原始数据:
    学生  成绩
0  张三    85
1  李四   150
2  王五    78
3  赵六    92
4  钱七   -10
==================================================
将异常值替换后的数据:
    学生  成绩
0  张三    85
1  李四   100
2  王五    78
3  赵六    92
4  钱七     0
==================================================
使用列表替换多个值:
    学生  成绩
0  张三    85
1  李四   100
2  王五    78
3  赵六    92
4  钱七     0

Пояснение к коду:

  • словарь{150: 100, -10: 0}Заменить выброс 150 на 100, а -10 на 0.
  • list[150, -10]и[100, 0]Укажите заменяемые значения и значения для замены соответственно, в соответствующем порядке.

Примечания

  • replace()По умолчанию исходный DataFrame не изменяется. Если вы хотите изменить его на месте, используйтеinplace=Trueпараметра.
  • При использовании регулярных выражений убедитесь, что синтаксис регулярного выражения правильный; сложные регулярные выражения могут привести к неожиданным результатам.
  • Замена основана на совпадении значений и не изменяет тип данных.
  • Обратите внимание на регистрозависимость; "Technology" и "Technology" — разные значения.
  • Перед заменой данных рекомендуется создать резервную копию исходных данных для сравнения и прослеживаемости.

Часто используемые функции Pandas

Другие расширения