pandas replace() 替換用法


 

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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM