pandas映射与数据转换

在 pandas 中提供了利用映射关系来实现某些操做的函数,具体以下:html

  • replace() 函数:替换元素;
  • map() 函数:新建一列;
  • rename() 函数:替换索引。

1、replace() 用映射替换元素

在数据处理时,常常会遇到须要将数据结构中原来的元素根据实际需求替换成新元素的状况。要想用新元素替换原来元素,就须要定义一组映射关系。在映射关系中,将旧元素做为键,新元素做为值。

例如,建立字典 fruits 用于指明水果标识和水果名称的映射关系。python

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 以下:数据结构

import numpy as np
import pandas as pd
#建立水果标识与水果名称的映射关系
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_No fru_Num price 0 orange 1000 3.56 1 apple 2000 4.20 2 banana 3000 2.50

replace() 函数应用的示例代码 example1.py 以下:app

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
s = Series([-1000,-999,2,3,4,5,-2000])
#单数值替换
print(s.replace(-2000,np.nan))
0 -1000.0
1 -999.0
2 2.0
3 3.0
4 4.0
5 5.0
6 NaN

#将多个数值替换
print(s.replace([-1000,-999],0))
0 0
1 0
2 2
3 3
4 4
5 5
6 -2000

#不一样的值进行不一样的替换
print(s.replace([-1000,-999],[np.nan,0]))
0 NaN
1 0.0
2 2.0
3 3.0
4 4.0
5 5.0
6 -2000.0

#用字典方式进行不一样的替换
print(s.replace({-1000:np.nan,-999:0,-2000:np.nan}))
0 NaN
1 0.0
2 2.0
3 3.0
4 4.0
5 5.0
6 NaN

2、用映射添加元素

   在【例 1】中介绍了利用函数和映射来实现将水果标识替换成水果名称的方法。可是有时须要保留水果标识,将水果名称添加到数据集中。函数

   那么,这时可利用 map() 函数,经过构建 fruits 映射关系来实现元素的添加。

map() 函数是做用于 Series 或 DataFrame 对象的一列,它接收一个函数或表示映射关系的字典做为参数,它的基本语法格式以下:ui

Series.map(arg,na_action=None)

函数中的参数说明以下:spa

  • arg:接收 function、dict 或 Series,表示映射通讯;
  • na_action:取值为{无,'忽略'},默认值为 None,若是为'忽略',则传播 NA 值,而不将它们传递给映射对应关系。


【例 2】利用 map() 函数和映射关系实现将水果名称添加到水果数据框中。
示例代码 test2.py 以下:code

import pandas as pd
#建立水果标识与水果名称的映射关系
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_No fru_Num price fru_name
0  101   1000    3.56  orange
1  102   2000    4.20  apple
2  103   3000    2.50  banana

3、重命名行/列索引

在数据处理中,有时须要使用映射关系转换轴标签。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 或 level name,默认为 None,若是是 MultiIndex,只重命名指定级别中的标签。

rename() 函数返回值是 DataFrame 或 Series。
【例 3】利用 rename() 函数和映射关系重命名水果数据框的行索引和列索引。
示例代码 test3.py 以下:

import pandas as pd
#建立行索引的映射关系
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_No fru_Num price
0   101  1000   3.56
1   102  2000   4.20
2   103  3000   2.50

#用映射重命名水果数据框的行索引,产生新DataFrame,但原数据不改变
newDf = data.rename(reindex)
print(newDf)
    fru_No fru_Num price
row1  101   1000    3.56
row2  102   2000    4.20
row3  103   3000    2.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)
    col1 col2 col3
row1 101 1000 3.56
row2 102 2000 4.20
row3 103 3000 2.50

#用映射重命名水果数据框的单个行索引和单个列索引
newDf = data.rename(index={'row2':'s1'},columns={'fru_No':'111'})
print(newDf)
     111 fru_Num price
row1 101  1000   3.56
s1   102  2000   4.20
row3 103  3000   2.50

注意:rename() 函数返回一个通过改动的新 DataFrame 对象,但原 DataFrame 对象仍保持不变,若是要改变调用函数的对象自己,可以使用 inplace 选项,并将其值设置为 True。

 

参考:https://www.92python.com/view/145.html

相关文章
相关标签/搜索