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

您所在的位置:网站首页 矩阵字母替换法 pandas的替换和部分替换(replace)

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

2023-09-12 08:56| 来源: 网络整理| 查看: 265

在处理数据的时候,很多时候会遇到批量替换的情况,如果一个一个去修改效率过低,也容易出错。 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分别是向前、向前、向后填充



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3