pandas的替换和部分替换(replace) |
您所在的位置:网站首页 › 矩阵字母替换法 › 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分别是向前、向前、向后填充 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |