python替换—Series.replace()与Series.str.replace()的区别及为何replace()无效的解决方法

news/2025/1/15 18:14:09/

文章目录

  • 前言
  • 一、Series.replace()方法
  • 二、Series.str.replace()方法
  • 三、replace()与str.replace() 使用方法的区别
  • 四、常见的坑:python中replace方法不起作用


前言

在Pandas中,Series是一个由一维数组表示的DataFrame列,而replace和str.replace是Series对象的两种方法。虽然它们的名称相似,并且都用于替换Series的值,但实际上它们之间存在不同之外。


一、Series.replace()方法

函数语法:

Series.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method=‘pad’,)

参数说明:

参数描述
to_replace被替换的值
value替换后的值
inplace是否要改变原数据,False是不改变,True是改变,默认是False。
limit控制填充次数。
regex是否使用正则,False是不使用,True是使用,默认是False。
method填充方式,pad,ffill,bfill分别是向前,向前,向后填充。

replace() 是一个大范围的值替换,第一个参数指定要替换的值 ,可以是标量、列表、字典或正则表达式。第二个参数指定用于替换匹配值的新值。

import pandas as pd
data = pd.DataFrame({'A': [1, 80, 4],'B': [9, 80, 5],'C': ['foo','another foo bar','baz']})
print("data:\n", data)
print("data.dtypes:\n", data.dtypes)#用dict进行单值、多值填充
data['C'].replace({'foo':'hello'}) #将C列中的foo替换成hello。
data['C'].replace({'foo':'hello','baz':'bus'}) #将C列中的foo替换成hello,baz替换成bus。
data.replace({1,9},{'a','b'}) #1被a替换,9被b替换。#用list进行单值、多值填充
data['C'].replace(['foo','baz'])#将C列中的foo替换成hello。
data['C'].replace(['foo','baz'],['hello','bus']) #将C列中的foo替换成hello,baz替换成bus。
data.replace([1,9],'b')  #1,9都被b替换。#替换全部
data.replace(80,8)#某一列或者某几列
data['B'].replace(9,20) #将B列中的9替换成20。
data[['A','B']].replace(80,8) #将A、B列中的9替换成20。#某一行或者某几行
data.iloc[1].replace(80,8) #第二行的80替换成8。
data.iloc[0:1].replace(80,8) #第一、二行的80替换成8。#inplace=True,改变原数据
data.replace(80,8,inplace=True)
data.iloc[0:1].replace(80,8,inplace=True)

二、Series.str.replace()方法

函数语法:

Series.str.replace(pat, repl,n=-1,case=None,flags=0,regex=None)

参数说明:

参数描述
pat要查找的字符串,string,不可省略的参数。
repl替换的字符串,string,可以调用函数,不可省略的参数。
n要进行替换的次数,默认全部。
case是否区分大小写。
flagsre模块中的标志。如re.IGNORECASE。
regex是否设置为正则表达式,False是不使用,True是使用,默认是True。

str.replace() 仅用于字符串匹配和替换,接受两个参数,第一个参数指定要替换的模式,仅限于正则表达式,第二个参数指定要用于替换的字符串。

import pandas as pd
data = pd.DataFrame({'A': ['1', '2', '4'],'B': ['2023/9/9', '2023/8/8','2023/5/4'],'C': ['FOO','ANOther foo bar','BAZ']})
print("data:\n", data)
print("data.dtypes:\n", data.dtypes)#普通替换
data['C'].str.replace('FOO','foo') #将C列中FOO替换成foo。#正则表达式的替换
data['B'].str.replace('[/]','-')#预编译好的正则表达式替换
import pandas as pd 
import re 
pat=re.compile('[/]')
data['B'].str.replace(pat,'-')#函数替换
data['C'].str.replace('[A-Z]',lambda x:x.group().lower()) #将C列中大写字母替换成小写字母。

三、replace()与str.replace() 使用方法的区别

1、replace()方法可以用于数字、布尔值和任何可替换的数据类型,而str.replace()方法仅适用于字符串

举例1
要求:将整个dataframe中数据列B的9替换成20,使用replace()方法。

import pandas as pd
data = pd.DataFrame({'A': ['1', '2', '4'],'B': [9, 80, 5],'C': ['FOO','ANOther foo bar','BAZ']})
print("data:\n", data)
print("data.dtypes:\n", data.dtypes)

运行结果:

data:A   B                C
0  1   9              foo
1  2  80  another foo bar
2  4   5              baz
data.dtypes:
A    object
B     int64
C    object
dtype: object
data['B'].replace(9,20)

运行结果:

0    20
1    80
2     5
Name: B, dtype: int64

举例2
要求:将整个dataframe中数据列B的9替换成20,使用str.replace()方法。

data['B'].str.replace(9,20)

运行结果:

在这里插入图片描述
我们可以看数据列B是int64数据类型,因此直接使用str.replace() 会报以下错误提示,因为str.replace()只针对字符串数据类型的列有效。


2、replace()方法可以一次为多个列工作,如果有需要,可以对整个DataFrame的值进行替换。

举例1
要求:将整个dataframe中的9替换成90,使用replace()方法。

import pandas as pd
data = pd.DataFrame({'A': [9, 20, 40],'B': [9, 80,5],'C': ['foo','another foo bar','baz']})
print("data:\n", data)
print("data.dtypes:\n", data.dtypes)print(data.replace({'foo':'hello',9:'bus'})) #将C列中的foo替换成hello,A、B列中9替换成bus。

运行结果:

     A    B                C
0  bus  bus            hello
1   20   80  another foo bar
2   40    5              baz
print(data.replace(9,90)) #将整个dataframe中的9替换成90

运行结果:

    A   B                C
0  90  90              foo
1  20  80  another foo bar
2  40   5              baz

举例2
要求:将整个dataframe中的9替换成90,使用str.replace()方法。

import pandas as pd
data = pd.DataFrame({'A': ['9', '20', '40'],'B': ['9', '80','5'],'C': ['foo','another foo bar','baz']})
print("data:\n", data)
print("data.dtypes:\n", data.dtypes)data.str.replace('9','90')
data.str.replace({'foo':'hello','9':'bus'})

使用str.replace对整个dataframe进行替换会报以下错误提示。
在这里插入图片描述


3、replace()方法可以一次执行多个独立的替换,str.replace()方法一次只可以替换一件事。

举例1
要求:将整个dataframe中的数据列C中foo替换成text1,bar替换成text2。

import pandas as pd
data = pd.DataFrame({'A': ['9', '20', '40'],'B': ['9', '80','5'],'C': ['foo','another foo bar','baz']})
print("data:\n", data)
print("data.dtypes:\n", data.dtypes)
  • 使用replace()方法:
data['C'].str.replace('foo','text1').str.replace('bar','text2')

运行结果:

0                  text1
1    another text1 text2
2                    baz
Name: C, dtype: object
  • 使用str.replace()方法:
#更好的表达方式
data['C'].replace({'foo': 'text1', 'bar': 'text2'}, regex=True)data['C'].replace('foo','text1',regex=True).replace('bar','text2'}, regex=True)

运行结果:

0                  text1
1    another text1 text2
2                    baz

4、replace()方法是默认regex=False,str.replace()方法是默认启用正则表达式替换。两者方法默认行为的差异:

  • 子字符串替换,str.replace()方法将替换每次出现的子字符串,replace() 方法默认情况下只会执行全字匹配
  • 正则表达式替换,replace()方法除非您指定 regex=True,否则将第一个参数解释为正则表达式的str.replace()方法恰恰相反。注意:replace()方法的regex=True只有在进行字符串替换才有效,例如data.replace({‘foo’:‘hello’,9:‘bus’}, regex=True)是无效的。

举例1

import pandas as pd
data = pd.DataFrame({'A': ['9', '20', '40'],'B': ['9', '80','5'],'C': ['foo','another foo bar','baz']})
print("data:\n", data)
print("data.dtypes:\n", data.dtypes)

要求:将字符串foo全部替换字符串text1。

data['C'].replace('foo','text1') #默认情况下,只会执行对foo全字匹配替换。
data['C'].replace('foo','text1',regex=True) #regex=True情况下,每次出现的子字符串foo都会被替换为text1。
data['C'].str.replace('foo','text1') #默认情况下,每次出现的子字符串foo都会被替换为text1。

运行结果1:
在这里插入图片描述
运行结果2:
在这里插入图片描述
运行结果3:

在这里插入图片描述


四、常见的坑:python中replace方法不起作用

导入数据

import os
import pandas as pd 
import numpy as np
#读取文件
def read_file(filepath):os.chdir(os.path.dirname(filepath))return pd.read_csv(os.path.basename(filepath),encoding='utf-8')
file_pos="F:\\python_test\\data_1.csv"
data_pos=read_file(file_pos)
data_pos

在这里插入图片描述

查看数据情况

data_pos.dtypes

运行结果:
在这里插入图片描述

举例1
要求:将2021金额与2022金额的 ¥ 与 , 这两个等号替换为空。

问题:使用replace无效。

def convert_currency(value):'''移除不是数字字符 ¥,'''new_value=value.replace({',':'','¥':''})return new_value#调用函数
a=convert_currency(data_pos['2021金额'])
a

运行结果:
在这里插入图片描述

解决方案

  • 方法一:
def convert_currency(value):'''移除不是数字字符 ¥,'''new_value=value.replace({',':'','¥':''},regex=True)return new_value#调用函数
a=convert_currency(data_pos['2021金额'])
a
  • 方法二:
def convert_currency(value):'''移除不是数字字符 ¥,'''new_value=value.str.replace(',','').str.replace('¥','')return new_value#调用函数
a=convert_currency(data_pos['2021金额'])
a

运行结果:

在这里插入图片描述


参考文章:

https://blog.csdn.net/m0_62011685/article/details/124716966?ydreferer=aHR0cHM6Ly9jbi5iaW5nLmNvbS8%3D
https://www.cnblogs.com/cgmcoding/p/13362539.html
https://www.coder.work/article/1269173
https://geek-docs.com/pandas/pandas-questions/419_pandas_what_is_the_difference_between_seriesreplace_and_seriesstrreplace.html


http://www.ppmy.cn/news/1060296.html

相关文章

Linux学习之NFS服务

《Linux 环境下 NFS 服务安装及配置使用》是一篇参考博客。 /etc/exports是NFS服务的配置文件,文件中的内容格式为: 共享目录的路径 允许访问的NFS客户端(共享权限参数1,共享权限参数2,共享权限参数3...)共享权限参数罗列如下: 参数作用ro只…

我裸辞去面试大公司python岗位了!

最近换工作了,坐标上海,裸辞,之前早有前辈们说过,“裸辞一时爽,一直裸辞一直爽”,这话一点不假,裸辞你要面临没有收入来源,但是每天眼睁睁看着各种花销不断支出的煎熬,我主要是觉得一…

深入解析:树结构及其应用

文章目录 学习树的基本概念理解树的遍历方式学习堆和优先队列的应用案例分析:使用堆进行Top K元素的查找结论 🎉欢迎来到数据结构学习专栏~深入解析:树结构及其应用 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈…

UltralSO软碟通制作Linux系统盘

第一步: 下载镜像 阿里云下载地址:https://mirrors.aliyun.com/centos-vault/ 按照需求选择系统版本,我这要求安装CentOS7.5的系统,我以CentOS7.5为例 第二步: 下载UltralSO软件 官网下载地址:https://cn.…

梳理系统学习R语言1-R语言实战-使用ggplot进行高阶绘图

以下为书中代码,会添加一些理解 library("ggplot2") ggplot(datamtcars,aes(xwt,ympg))geom_point()geom_point(pch17,color"blue",size2)geom_smooth(method"lm",color"red",linetype2)labs(title"Automobile Data&…

SpringBoot案例-配置文件-参数配置化

前言 目前我们已经完成了部门管理和员工管理功能接口的实现,阿里云OSS工具类中,我们会设置4个参数,分别是云服务域名、云服务ID和密码、文件存储的Bucket、就会存在以下问题:参数配置分散以及参数发生变化,就需要对应…

预防缓存穿透工具类

1. 前言 缓存穿透大家都知道,这里简单过一下 缓存和数据库中都没有的数据,而用户不断发起请求。比如查询id -1 的值 想着很多面向C端的查询接口,可能都需要做一下缓存操作,这里简单写了个自定义注解,将查询结果(包含…

portainer初体验

官方文档 安装 docker 这里采用的的是国内汉化的一个镜像,版本号2.16.2。 地址 docker run -d --restartalways --name"portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock 6053537/portainer-ce体验 访问9000端口。 尝试&#x…