Pandas df.replace() 函数
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)
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
代码解析:
- DataFrame 中有两行"技术"部门。
- 使用
df.replace('技术', '研发')将所有"技术"替换为"研发"。 - 这种方法会替换 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)
# 创建一个包含需要替换的数据的 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)
# 创建一个 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)
# 创建一个包含需要用正则表达式处理的 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)
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)
# 创建一个包含异常值的 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 常用函数