2021.02.05補充
之前寫的替換都是整個值,也即是說如果被替換值='asdfg',之前的只有值等於='asdfg',才可以被替換,但是我們很多時候是值想替換局部的,比如說‘深圳地區’,替換為‘深圳市’,那么就得先str,代碼如下:
main_copy['city']=main_copy['city'].str.replace('地區','市')
====================================================================
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分別是向前、向前、向后填充
import pandas as pd import numpy as np #構造數據 df=pd.DataFrame({'a':['?',7499,'?',7566,7654,'?',7782],'b':['SMITH', '.','$','.' ,'MARTIM','BLAKE','CLARK'], 'c':['CLERK','SALESMAN','$','MANAGER','$','MANAGER','$'], 'd':[7902,7698,7698,7839,7698,7839,7839], 'e':['1980/12/17','1981/2/20','1981/2/22','1981/4/2','1981/9/28','1981/5/1','1981/6/9'], 'f':[800,1600,1250,2975,1230,2859,2450], 'g':[np.nan,300.0,500.0,np.nan,1400.0,np.nan,np.nan], 'h':[20,30,30,20,30,30,10]}) #替換全部或者某行某列 #全部替換,這二者效果一樣 df.replace(20,30) df.replace(to_replace=20,value=30) #某一列或者某幾列 df['h'].replace(20,30) df[['b','c']].replace('$','rmb') #某一行或者幾行 df.iloc[1].replace(1600,1700) df.iloc[1:3].replace(30,40) #inplace=True df.replace(20,30,inplace=True) df.iloc[1:3].replace(30,40,inplace=True) #用list或者dict進行單值或者多值填充, #單值 #注意,list是前者替換后者,dict字典里的建作為原值,字典里的值作為替換的新值 df.replace([20,30]) df.replace({20:30}) #多值,list是list逗號后的值替換list的值,dict字典里的建作為原值,字典里的值作為替換的新值 df.replace([20,1600],[40,1700]) #20被40替換,1600被1700替換 df.replace([20,30],'b') #20,30都被b替換 df.replace({20:30,1600:1700}) df.replace({20,30},{'a','b'}) #這個和list多值用法一樣 #,method #其實只需要傳入被替換的值, df.replace(['a',30],method='pad') df.replace(['a',30],method='ffill') df.replace(['a',30],method='bfill') #可以直接這樣表達 df.replace(30,method='bfill') #用30下面的最靠近非30的值填充 df.replace(30,method='ffill') #用30上面最靠近非30的值填充 df.replace(30,method='pad') #用30上面最靠近非30的值填充 #一般用於空值填充 df.replace(np.nan,method='bfill') #limit df.replace(30,method='bfill',limit=1) #現在填充的間隔數
正則替換的需要先補充一下正則表達式
#正則替換 #轉義字符\可以轉義很多字符,比如\n表示換行,\t表示制表符,字符\本身也要轉義,所以\\表示的字符就是\ #如果字符串里面有很多字符都需要轉義,就需要加很多\,為了簡化,Python還允許用r''表示''內部的字符串默認不轉義 df.replace(r'\?|\.|\$',np.nan) #和原來沒有變化 df.replace(r'\?|\.|\$',np.nan,regex=True)#用np.nan替換?或.或$原字符 df.replace([r'\?',r'\$'],np.nan,regex=True)#用np.nan替換?和$ df.replace([r'\?',r'\$'],[np.nan,'NA'],regex=True)#用np.nan替換?用NA替換$符號 df.replace(regex={r'\?':None}) #當然,如果不想使用inplace=True,也可以這樣子表達 df=df.replace(20,30) df.replace(20,30,inplace=True)
全部代碼如下:
# -*- coding: utf-8 -*- """ Created on Tue Jul 21 10:52:00 2020 @author: Admin """ import pandas as pd import numpy as np #構造數據 df=pd.DataFrame({'a':['?',7499,'?',7566,7654,'?',7782],'b':['SMITH', '.','$','.' ,'MARTIM','BLAKE','CLARK'], 'c':['CLERK','SALESMAN','$','MANAGER','$','MANAGER','$'], 'd':[7902,7698,7698,7839,7698,7839,7839], 'e':['1980/12/17','1981/2/20','1981/2/22','1981/4/2','1981/9/28','1981/5/1','1981/6/9'], 'f':[800,1600,1250,2975,1230,2859,2450], 'g':[np.nan,300.0,500.0,np.nan,1400.0,np.nan,np.nan], 'h':[20,30,30,20,30,30,10]}) #替換全部或者某行某列 #全部替換,這二者效果一樣 df.replace(20,30) df.replace(to_replace=20,value=30) #某一列或者某幾列 df['h'].replace(20,30) df[['b','c']].replace('$','rmb') #某一行或者幾行 df.iloc[1].replace(1600,1700) df.iloc[1:3].replace(30,40) #inplace=True df.replace(20,30,inplace=True) df.iloc[1:3].replace(30,40,inplace=True) #用list或者dict進行單值或者多值填充, #單值 #注意,list是前者替換后者,dict字典里的建作為原值,字典里的值作為替換的新值 df.replace([20,30]) df.replace({20:30}) #多值,list是list逗號后的值替換list的值,dict字典里的建作為原值,字典里的值作為替換的新值 df.replace([20,1600],[40,1700]) #20被40替換,1600被1700替換 df.replace([20,30],'b') #20,30都被b替換 df.replace({20:30,1600:1700}) df.replace({20,30},{'a','b'}) #這個和list多值用法一樣 #,method #其實只需要傳入被替換的值, df.replace(['a',30],method='pad') df.replace(['a',30],method='ffill') df.replace(['a',30],method='bfill') #可以直接這樣表達 df.replace(30,method='bfill') #用30下面的最靠近非30的值填充 df.replace(30,method='ffill') #用30上面最靠近非30的值填充 df.replace(30,method='pad') #用30上面最靠近非30的值填充 #一般用於空值填充 df.replace(np.nan,method='bfill') #limit df.replace(30,method='bfill',limit=1) #現在填充的間隔數 #正則替換 #轉義字符\可以轉義很多字符,比如\n表示換行,\t表示制表符,字符\本身也要轉義,所以\\表示的字符就是\ #如果字符串里面有很多字符都需要轉義,就需要加很多\,為了簡化,Python還允許用r''表示''內部的字符串默認不轉義 df.replace(r'\?|\.|\$',np.nan) #和原來沒有變化 df.replace(r'\?|\.|\$',np.nan,regex=True)#用np.nan替換?或.或$原字符 df.replace([r'\?',r'\$'],np.nan,regex=True)#用np.nan替換?和$ df.replace([r'\?',r'\$'],[np.nan,'NA'],regex=True)#用np.nan替換?用NA替換$符號 df.replace(regex={r'\?':None}) #當然,如果不想使用inplace=True,也可以這樣子表達 df=df.replace(20,30) df.replace(20,30,inplace=True)