pandas的替换和部分替换(replace)

在处理数据的时候,很多时候会遇到批量替换的情况,如果一个一个去修改效率过低,也容易出错。
replace()是很好的方法。

日期高温低温风向强度
2019-01-01-7℃-17℃西南风1级
2019-01-02-3℃-16℃东南风1级
2019-01-032℃-10℃西南风1级
2019-01-04-2℃-15℃西南风1级
2019-01-05-5℃-15℃东北风1级
2019-01-06-5℃-16℃西南风1级
2019-01-07-2℃-16℃西南风1级
2019-01-08-5℃-15℃东北风2级
2019-01-090℃-7℃东南风2级
2019-01-104℃-10℃东南风1级

一、导入数据

import pandas as pd # 引入pandas
df = pd.read_excel("tianqi.xlsx")  # 导入文件
df.set_index("日期", inplace = True) # 日期列设置为index
print(df)

日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 西南风 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 西南风 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 西南风 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级

二、替换全部
replace的基本结构是:df.replace(to_replace, value) 前面是需要替换的值,后面是替换后的值。

df.replace("-7℃","【一朵】")

这样Python就会搜索整个DataFrame并将文档中所有的“-7℃”替换成“【一朵】”。要注意这样的操作并没有改变文档的源数据,要改变源数据需要使用inplace = True

df.replace("-7℃","【一朵】",inplace = True)

日期 高温 低温 风向 强度
2019-01-01 【一朵】 -17℃ 西南风 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 西南风 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 西南风 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ 【一朵】 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级

三、替换某列里的内容,而不改变其它列
仅将[“高温”]列的“-7℃”替换成“【一朵】”

df["高温"].replace("-7℃","【一朵】",inplace = True)

日期 高温 低温 风向 强度
2019-01-01 【一朵】 -17℃ 西南风 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 西南风 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 西南风 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级

四、替换某列数据的部分内容
将[“高温”]列的“℃”替换成“",达到删除效果。
.astype(“int32”)转换为数字。

df["高温"] = df["高温"].str.replace("℃","").astype("int32")

日期 高温 低温 风向 强度
2019-01-01 -7 -17℃ 西南风 1级
2019-01-02 -3 -16℃ 东南风 1级
2019-01-03 2 -10℃ 西南风 1级
2019-01-04 -2 -15℃ 西南风 1级
2019-01-05 -5 -15℃ 东北风 1级
2019-01-06 -5 -16℃ 西南风 1级
2019-01-07 -2 -16℃ 西南风 1级
2019-01-08 -5 -15℃ 东北风 2级
2019-01-09 0 -7℃ 东南风 2级
2019-01-10 4 -10℃ 东南风 1级

查看数据类型

print(df.dtypes)

高温 int32
低温 object
风向 object
强度 object
dtype: object

注意:
使用str.replace时不能使用inplace = True参数,因此需要改成赋值。赋值的时候不要忘了是列的赋值而不是整个表格的赋值。请体会下面的区别。

df = df["高温"].str.replace("℃","").astype("int32")

日期
2019-01-01 -7
2019-01-02 -3
2019-01-03 2
2019-01-04 -2
2019-01-05 -5
2019-01-06 -5
2019-01-07 -2
2019-01-08 -5
2019-01-09 0
2019-01-10 4
Name: 高温, dtype: int32
五、替换某行内容
将[“2019-01-01”]行的“西南风"替换成“【一朵】"。

df.loc["2019-01-01"].replace("西南风","【一朵】", inplace = True)

日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一朵】 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 西南风 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 西南风 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级

将"2019-01-01"到"2019-01-03"里面的"西南风"替换为"【一朵】"

df.loc["2019-01-01":"2019-01-03"].replace("西南风","【一朵】", inplace = True)

日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一朵】 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 【一朵】 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 西南风 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级
D:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py:4172: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
method=method,
可以正常显示结果,但是有很多提示,我看不懂。大概是不建议这么使用。

六、替换指定的某一个或多个值(用字典、列表的形式)
用字典替换多个数值,比较容易理解,字典里的键作为原值,字典里的值作为替换的新值。

df.replace({"西南风":"【一】","东南风":"【朵】"}, inplace = True)

日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一】 1级
2019-01-02 -3℃ -16℃ 【朵】 1级
2019-01-03 2℃ -10℃ 【一】 1级
2019-01-04 -2℃ -15℃ 【一】 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 【一】 1级
2019-01-07 -2℃ -16℃ 【一】 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 【朵】 2级
2019-01-10 4℃ -10℃ 【朵】 1级

用列表的形式替换多个数值,前面列表保存原值,后面列表保存新值。

df.replace(["西南风","东南风"],["【一】","【朵】"], inplace = True)

日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一】 1级
2019-01-02 -3℃ -16℃ 【朵】 1级
2019-01-03 2℃ -10℃ 【一】 1级
2019-01-04 -2℃ -15℃ 【一】 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 【一】 1级
2019-01-07 -2℃ -16℃ 【一】 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 【朵】 2级
2019-01-10 4℃ -10℃ 【朵】 1级

替换的新值是相同的,还可以这样使用:

df.replace(["西南风","东南风"],"【一朵】", inplace = True)

日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一朵】 1级
2019-01-02 -3℃ -16℃ 【一朵】 1级
2019-01-03 2℃ -10℃ 【一朵】 1级
2019-01-04 -2℃ -15℃ 【一朵】 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 【一朵】 1级
2019-01-07 -2℃ -16℃ 【一朵】 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 【一朵】 2级
2019-01-10 4℃ -10℃ 【一朵】 1级

七、使用正则表达式替换
正则表达式可以实现一次替换很多个有规律的不同值
先将“西南风”、“东南风”替换为英文字母,用于演示

df["风向"].replace(["西南风","东南风"],["A","C"], inplace = True)

日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ A 1级
2019-01-02 -3℃ -16℃ C 1级
2019-01-03 2℃ -10℃ A 1级
2019-01-04 -2℃ -15℃ A 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ A 1级
2019-01-07 -2℃ -16℃ A 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ C 2级
2019-01-10 4℃ -10℃ C 1级

然后将英文字母替换为“【一朵】”,使用正则表达式的时候记得后面加 regex=True参数

df["风向"].replace("[A-Z]","【一朵】", regex = True, inplace = True)

日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 【一朵】 1级
2019-01-02 -3℃ -16℃ 【一朵】 1级
2019-01-03 2℃ -10℃ 【一朵】 1级
2019-01-04 -2℃ -15℃ 【一朵】 1级
2019-01-05 -5℃ -15℃ 东北风 1级
2019-01-06 -5℃ -16℃ 【一朵】 1级
2019-01-07 -2℃ -16℃ 【一朵】 1级
2019-01-08 -5℃ -15℃ 东北风 2级
2019-01-09 0℃ -7℃ 【一朵】 2级
2019-01-10 4℃ -10℃ 【一朵】 1级

八、使用条件替换
判断[“高温”] 列的字符串为 “-5℃"时,将本行的 [“风向”]列,替换为”【一朵】"

df.loc[df["高温"] == "-5℃", "风向"] = "【一朵】"

日期 高温 低温 风向 强度
2019-01-01 -7℃ -17℃ 西南风 1级
2019-01-02 -3℃ -16℃ 东南风 1级
2019-01-03 2℃ -10℃ 西南风 1级
2019-01-04 -2℃ -15℃ 西南风 1级
2019-01-05 -5℃ -15℃ 【一朵】 1级
2019-01-06 -5℃ -16℃ 【一朵】 1级
2019-01-07 -2℃ -16℃ 西南风 1级
2019-01-08 -5℃ -15℃ 【一朵】 2级
2019-01-09 0℃ -7℃ 东南风 2级
2019-01-10 4℃ -10℃ 东南风 1级

也可以用数字做判断条件
先将[“高温”]列转换为数字

df["高温"] = df["高温"].str.replace("℃","").astype("int32")

日期 高温 低温 风向 强度
2019-01-01 -7 -17℃ 西南风 1级
2019-01-02 -3 -16℃ 东南风 1级
2019-01-03 2 -10℃ 西南风 1级
2019-01-04 -2 -15℃ 西南风 1级
2019-01-05 -5 -15℃ 东北风 1级
2019-01-06 -5 -16℃ 西南风 1级
2019-01-07 -2 -16℃ 西南风 1级
2019-01-08 -5 -15℃ 东北风 2级
2019-01-09 0 -7℃ 东南风 2级
2019-01-10 4 -10℃ 东南风 1级

判断[“高温”]列数值 >=0 时,将本行的 [“风向”]列,替换为 “【一朵】”

df.loc[df["高温"] >= 0, "风向"] = "【一朵】"

日期 高温 低温 风向 强度
2019-01-01 -7 -17℃ 西南风 1级
2019-01-02 -3 -16℃ 东南风 1级
2019-01-03 2 -10℃ 【一朵】 1级
2019-01-04 -2 -15℃ 西南风 1级
2019-01-05 -5 -15℃ 东北风 1级
2019-01-06 -5 -16℃ 西南风 1级
2019-01-07 -2 -16℃ 西南风 1级
2019-01-08 -5 -15℃ 东北风 2级
2019-01-09 0 -7℃ 【一朵】 2级
2019-01-10 4 -10℃ 【一朵】 1级

多条件替换也可以
判断[“高温”]列数值 >=0 并且 [“强度”]列字符串为"2级"时,将本行的 [“风向”]列,替换为 “【一朵】”。注意&前后的筛选条件用()括起来

df.loc[(df["高温"] >= 0) & (df["强度"] == "2级"), "风向"] = "【一朵】" 

日期 高温 低温 风向 强度
2019-01-01 -7 -17℃ 西南风 1级
2019-01-02 -3 -16℃ 东南风 1级
2019-01-03 2 -10℃ 西南风 1级
2019-01-04 -2 -15℃ 西南风 1级
2019-01-05 -5 -15℃ 东北风 1级
2019-01-06 -5 -16℃ 西南风 1级
2019-01-07 -2 -16℃ 西南风 1级
2019-01-08 -5 -15℃ 东北风 2级
2019-01-09 0 -7℃ 【一朵】 2级
2019-01-10 4 -10℃ 东南风 1级

九、使用函数替换
lambda函数也适合用来筛选并替换,达到和上面条件筛选一样的效果

df.loc[lambda df : (df["高温"] >= 0) & (df["强度"] == "1级"), "风向"] = "【一朵】" 

日期 高温 低温 风向 强度
2019-01-01 -7 -17℃ 西南风 1级
2019-01-02 -3 -16℃ 东南风 1级
2019-01-03 2 -10℃ 【一朵】 1级
2019-01-04 -2 -15℃ 西南风 1级
2019-01-05 -5 -15℃ 东北风 1级
2019-01-06 -5 -16℃ 西南风 1级
2019-01-07 -2 -16℃ 西南风 1级
2019-01-08 -5 -15℃ 东北风 2级
2019-01-09 0 -7℃ 东南风 2级
2019-01-10 4 -10℃ 【一朵】 1级

自定义函数的筛选并替换,效果也是一样的。
……暂时还没有学会

replace()

既可以替换某列,也可以替换某行,还可以全表替换
df.replace() 或者 df[col]replace()

参数如下:
df.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分别是向前、向前、向后填充

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值