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

相關文章
相關標籤/搜索