详解pandas映射与数据转换
在pandas中提供了利用映射关系来实现某些操作的函数,具体如下:
- replace()函数:替换元素;
- map()函数:新建一列;
- rename()函数:替换索引。
一、replace() 用映射替换元素
在数据处理时,经常会遇到需要将数据结构中原来的元素根据实际需求替换成新元素的情况。要想用新元素替换原来元素,就需要定义一组映射关系。在映射关系中,将旧元素作为键,新元素作为值。
例如,创建字典fruits用于指明水果标识和水果名称的映射关系。
fruits={101:'orange',102:'apple',103:'banana'}
如要将用于存储水果标识、水果数量和单价的DataFrame对象中的水果标识替换成水果名称,就需要运用replace()函数,通过fruits映射关系来实现元素的替换。
replace()函数的基本语法格式如下:
obj.replace(to_replace=None,value=None,inplace=False,limit=None,regex= False,method='pad')
函数中的参数说明如下:
- obj:DataFrame或Series对象;
- to_replace:接收str、regex、list、dict、Series、int、float或者None,表示将被替换的值;
- value:接收标量、字典、列表、str、正则表达式,默认为None;用于替换与to_replace匹配的任何值的值;对于DataFrame,可以使用值的dict来指定每列使用哪个值(不在dict中的列将不会被填充);还允许使用正则表达式、字符串和列表或这些对象的dict;
- inplace:接收布尔值,默认为False,如果是True,将修改原来的数据;
- limit:接收int,默认为None,用于限制填充次数;
- regex:接收bool或与to_replace相同的类型,默认为False,表示是否将to_replace或value解释为正则表达式,如果是True,那么to_replace必须是一个字符串,当是正则表达式或正则表达式的列表、字典或数组时,to_replace必须为None;
- method:取值为{'pad','ffill','bfill',无},表示替换时使用的方法,与缺失值填充方法类似,当to_replace是标量、列表或元组时,值为None。
【例1】利用replace()函数和映射关系实现将水果数据框中水果标识替换成水果名称。
示例代码test1.py如下:
importnumpyasnp importpandasaspd #创建水果标识与水果名称的映射关系 fruits={101:'orange',102:'apple',103:'banana'} #创建水果数据框DataFrame data=pd.DataFrame({'fru_No':[101,102,103],'fru_Num':[1000,2000,3000] ,'price':[3.56,4.2,2.5]}) #用映射替换fru_No列的元素 newDf=data.replace(fruits) print(newDf) #输出如下 fru_Nofru_Numprice 0orange10003.56 1apple20004.20 2banana30002.50
replace()函数应用的示例代码example1.py如下:
importnumpyasnp importpandasaspd frompandasimportSeries,DataFrame s=Series([-1000,-999,2,3,4,5,-2000]) #单数值替换 print(s.replace(-2000,np.nan)) 0-1000.0 1-999.0 22.0 33.0 44.0 55.0 6NaN #将多个数值替换 print(s.replace([-1000,-999],0)) 00 10 22 33 44 55 6-2000 #不同的值进行不同的替换 print(s.replace([-1000,-999],[np.nan,0])) 0NaN 10.0 22.0 33.0 44.0 55.0 6-2000.0 #用字典方式进行不同的替换 print(s.replace({-1000:np.nan,-999:0,-2000:np.nan})) 0NaN 10.0 22.0 33.0 44.0 55.0 6NaN
二、用映射添加元素
在【例1】中介绍了利用函数和映射来实现将水果标识替换成水果名称的方法。但是有时需要保留水果标识,将水果名称添加到数据集中。
那么,这时可利用map()函数,通过构建fruits映射关系来实现元素的添加。
map()函数是作用于Series或DataFrame对象的一列,它接收一个函数或表示映射关系的字典作为参数,它的基本语法格式如下:
Series.map(arg,na_action=None)
函数中的参数说明如下:
- arg:接收function、dict或Series,表示映射通信;
- na_action:取值为{无,'忽略'},默认值为None,如果为'忽略',则传播NA值,而不将它们传递给映射对应关系。
【例2】利用map()函数和映射关系实现将水果名称添加到水果数据框中。
示例代码test2.py如下:
importpandasaspd #创建水果标识与水果名称的映射关系 fruits={101:'orange',102:'apple',103:'banana'} #创建水果数据框DataFrame data=pd.DataFrame({'fru_No':[101,102,103],'fru_Num':[1000,2000,3000],'price': [3.56,4.2,2.5]}) #用映射为data添加fru_name列元素 data['fru_name']=data['fru_No'].map(fruits) print(data) fru_Nofru_Numpricefru_name 010110003.56orange 110220004.20apple 210330002.50banana
三、重命名行/列索引
在数据处理中,有时需要使用映射关系转换轴标签。pandas的rename()函数是以表示映射关系的字典对象作为参数,替换轴的索引标签。
rename()函数的基本语法格式如下:
DataFrame.rename(mapper=None,index=None,columns=None,axis=None,copy=True, inplace=False,level=None) 或 Series.rename(index=None,**kwargs)
函数中的参数说明如下:
- mapper、index、columns:接收dict或function,表示将dict或函数转换为应用于该轴的值,使用mapper参数要指定映射器;使用columns参数可重命名各列;
- axis:接收int或str,可选,表示映射器定位的轴,可以是轴名称(“index”,“columns”)或数字(0,1),默认为“index”;
- copy:接收boolean,默认为True,表示是否复制数据;
- inplace:接收boolean,默认为False,如果为True,将会修改原来的数据;
- level:接收int或levelname,默认为None,如果是MultiIndex,只重命名指定级别中的标签。
rename()函数返回值是DataFrame或Series。
【例3】利用rename()函数和映射关系重命名水果数据框的行索引和列索引。
示例代码test3.py如下:
importpandasaspd #创建行索引的映射关系 reindex={0:'row1',1:'row2',2:'row3'} #创建水果数据框DataFrame data=pd.DataFrame({'fru_No':[101,102,103],'fru_Num':[1000,2000,3000],'price': [3.56,4.2,2.5]}) fru_Nofru_Numprice 010110003.56 110220004.20 210330002.50 #用映射重命名水果数据框的行索引,产生新DataFrame,但原数据不改变 newDf=data.rename(reindex) print(newDf) fru_Nofru_Numprice row110110003.56 row210220004.20 row310330002.50 #用映射重命名水果数据框的行索引,产生新DataFrame,但原数据改变 newDf=data.rename(reindex,inplace=True) print(newDf)#newDf是None,data原数据改变 #创建列索引的映射关系 recolumns={'fru_No':'col1','fru_Num':'col2','price':'col3'} #用映射重命名水果数据框中的行索引和列索引 newDf=data.rename(index=reindex,columns=recolumns) print(newDf) col1col2col3 row110110003.56 row210220004.20 row310330002.50 #用映射重命名水果数据框的单个行索引和单个列索引 newDf=data.rename(index={'row2':'s1'},columns={'fru_No':'111'}) print(newDf) 111fru_Numprice row110110003.56 s110220004.20 row310330002.50
注意:rename()函数返回一个经过改动的新DataFrame对象,但原DataFrame对象仍保持不变,如果要改变调用函数的对象本身,可使用inplace选项,并将其值设置为True。
以上就是详解pandas映射与数据转换的详细内容,更多关于pandas映射与数据转换的资料请关注毛票票其它相关文章!