现在位置: 首页 > Pandas 教程 > 正文

Pandas df.replace() 函数

Pandas 常用函数 Pandas 常用函数


df.replace() 是 Pandas 中用于替换 DataFrame 中数据的函数。

数据替换是数据清洗中的常见操作,replace() 可以帮助你将特定值替换为新值,支持单值替换、多值替换、正则表达式替换等多种灵活的方式。这在处理异常值、统一数据格式、编码转换等场景中非常有用。


基本语法与参数

replace() 是 DataFrame 的成员函数,通过点运算符 . 来调用。

语法格式

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

参数说明

参数 类型 是否必填 说明 默认值
to_replace str, regex, list, dict, int, float, None 必填 要替换的值。可以是单个值、值列表、字典、正则表达式等。 None
value scalar, dict, list, str, regex, None 可选 替换后的值。如果 to_replace 是字典,则此项可省略;如果不是字典,则此项必填。 None
inplace bool 可选 如果为 True,直接在原 DataFrame 上修改,不返回新对象;如果为 False,返回一个新的 DataFrame,原数据不变。 False
limit int 可选 指定替换的最大次数。 None
regex bool 或 str 可选 如果为 True,将 to_replace 视为正则表达式。 False
method str 可选 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 = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '部门': ['技术', '市场', '技术', '市场'],
    '薪资': [5000, 6000, 5500, 7000]
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 将"技术"替换为"研发"
df_replaced = df.replace('技术', '研发')

print("替换后的数据:")
print(df_replaced)

运行结果预期:

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

代码解析:

  1. DataFrame 中有两行"技术"部门。
  2. 使用 df.replace('技术', '研发') 将所有"技术"替换为"研发"。
  3. 这种方法会替换 DataFrame 中所有匹配的值。

示例 2:多个值的一对一替换

使用字典一次性替换多个不同的值。

实例

import pandas as pd

# 创建一个包含需要替换的数据的 DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '城市': ['北京', '上海', '广州', '深圳'],
    '等级': ['A', 'B', 'A', 'C']
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 使用字典进行多个替换
replacements = {
    '北京': '北京市',
    '上海': '上海市',
    '广州': '广州市',
    '深圳': '深圳市',
    'A': '优秀',
    'B': '良好',
    'C': '及格'
}
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 = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '部门': ['技术', '市场', '技术', '市场'],
    '职位': ['技术', '市场', '技术', '市场']
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 只替换"部门"列中的"技术"为"研发"
df_replaced = df.replace({'部门': '技术'}, '研发')

print("只替换部门列后的数据:")
print(df_replaced)
print("=" * 50)

# 也可以使用嵌套字典,对不同列使用不同的替换规则
df_replaced2 = df.replace({'部门': {'技术': '研发', '市场': '销售'}, '职位': '技术'})

print("对不同列使用不同规则替换后的数据:")
print(df_replaced2)

运行结果预期:

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

代码解析:

  • 使用 {'部门': '技术'} 可以只替换"部门"列中的值。
  • 嵌套字典 {'部门': {'技术': '研发'}} 可以对不同列指定不同的替换规则。

示例 4:使用正则表达式替换

regex=True 参数允许使用正则表达式进行替换,这在处理模式匹配的文本时非常有用。

实例

import pandas as pd

# 创建一个包含需要用正则表达式处理的 DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '电话': ['138-0000-0000', '139-1111-1111', '137-2222-2222', '136-3333-3333'],
    '备注': ['正常', 'VIP客户', '正常', 'VIP 客户']
}
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客户"(可能有空格差异)
df_replaced2 = df.replace(to_replace=r'VIPs*客户?', 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*客户? 匹配"VIP客户"和"VIP 客户"两种格式,统一替换为"VIP"。

示例 5:替换缺失值 NaN

replace() 也可以用来替换缺失值 NaN,这是数据清洗中的常见操作。

实例

import pandas as pd
import numpy as np

# 创建一个包含缺失值的 DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, np.nan, 35, np.nan],
    '薪资': [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 替换为其他值,如"未知"
df_replaced2 = df.replace(np.nan, '未知')

print("将 NaN 替换为'未知'后的数据:")
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 = {
    '学生': ['张三', '李四', '王五', '赵六', '钱七'],
    '成绩': [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。
  • 列表 [150, -10][100, 0] 分别指定要替换的值和替换后的值,按顺序对应。

注意事项

  • replace() 默认不会修改原始 DataFrame,如果想原地修改,使用 inplace=True 参数。
  • 使用正则表达式时,确保正则表达式语法正确,复杂的正则表达式可能会导致意外结果。
  • 替换操作是基于值匹配的,不会改变数据的类型。
  • 注意区分大小写,"技术"和"技术"是不同的值。
  • 在进行数据替换前,建议先备份原始数据,以便对比和回溯。

Pandas 常用函数 Pandas 常用函数