日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
兩大步驟,29行代碼學(xué)會(huì)數(shù)據(jù)清洗

 

本文轉(zhuǎn)載自微信公眾號(hào)「數(shù)倉(cāng)寶貝庫(kù)」,作者王愷 等。轉(zhuǎn)載本文請(qǐng)聯(lián)系數(shù)倉(cāng)寶貝庫(kù)公眾號(hào)。

10年積累的做網(wǎng)站、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有博興免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

 01處理缺失數(shù)據(jù)

缺失數(shù)據(jù)是數(shù)據(jù)文件中最常見的問(wèn)題之一。在Pandas中的缺失值表示為NA,其中數(shù)值類型的缺失值標(biāo)記為NaN(Not a Number),datetime類型的缺失值標(biāo)記為NaT(Not a Time)。缺失值的存在可能會(huì)引起后續(xù)的數(shù)據(jù)分析錯(cuò)誤。

在清洗數(shù)據(jù)之前,首先要確定數(shù)據(jù)中是否存在缺失值以及缺失值的確切位置。Pandas提供了isna()和notna()方法,用于快速確定Series和DataFrame對(duì)象中缺失值的位置,其語(yǔ)法格式如下:

  • pd.isna(data) 或者 data.isna()
  • pd.notna(data) 或者 data.notna()

data可以是一個(gè)Series對(duì)象,返回值為布爾Series對(duì)象;也可以是一個(gè)DataFrame對(duì)象,返回值為布爾DataFrame對(duì)象;還可以是一個(gè)標(biāo)量值,此時(shí)返回一個(gè)布爾值。對(duì)于isna方法,data中如果包含NA值,則返回值對(duì)應(yīng)的位置為True,其余正常元素對(duì)應(yīng)的位置為False。notna方法與isna方法相反,data中如果包含NA值,則返回值對(duì)應(yīng)的位置為False,其余正常元素對(duì)應(yīng)的位置為True。

Pandas提供了幾種處理缺失值的方法,即為缺失值重新賦值、刪除缺失值所在的行、刪除數(shù)據(jù)缺失率較高的列等。刪除缺失值的方法一般用于缺失值較少、對(duì)整體數(shù)據(jù)影響不大的情況。

1)Pandas提供了fillna方法用于將缺失值重新賦值為新的元素值,常用的語(yǔ)法格式如下:

 
 
 
  1. result=data.fillna(value,method=None,…) 

其中data既可以是Series對(duì)象,也可以是DataFrame對(duì)象。value可以是一個(gè)固定的元素,比如0;value也可以是一個(gè)字典對(duì)象、Series對(duì)象或DataFrame對(duì)象,用于將data中匹配標(biāo)簽(Series對(duì)象)或匹配列標(biāo)簽(DataFrame對(duì)象)所對(duì)應(yīng)的缺失值替換為不同的值,未與value匹配的data中的缺失值則不會(huì)被替換。method表示填充NA值的方法,缺省時(shí)默認(rèn)為None。method='ffill'或者'method=pad'時(shí)使用上一個(gè)有效值填充NA值,而method='bfill'或者'method=backfill'時(shí)使用下一個(gè)有效值來(lái)填充NA值。fillna的返回值為新賦值的Series或DataFrame對(duì)象。

2)Pandas提供了dropna方法,實(shí)現(xiàn)按行或列刪除NA值的功能,其語(yǔ)法格式如下:

 
 
 
  1. result =data.dropna(axis=0,how='any',…) 

如果data是Series對(duì)象,則axis只能等于0,直接刪除所有的NA值。如果data是DataFrame對(duì)象,參數(shù)axis為0或'index',實(shí)現(xiàn)刪除缺失值所在的行;如果設(shè)置axis為1或'columns',則刪除缺失值所在的列;axis缺省時(shí)默認(rèn)為0。how = 'any'表示只要有NA值存在,就會(huì)刪除所在的行或列;how='all'表示只有當(dāng)全部元素都是NA值時(shí)才會(huì)執(zhí)行刪除操作;how缺省時(shí)默認(rèn)為'any'。dropna的返回值為刪掉缺失值的Series或DataFrame對(duì)象。

3)Pandas還為Series和DataFrame提供了interpolate()方法,通過(guò)插值法補(bǔ)充缺失的數(shù)據(jù)點(diǎn),其語(yǔ)法格式如下:

 
 
 
  1. result=data.interpolate(method='linear',axis=0,…) 

method表示使用的插值方法,缺省時(shí)默認(rèn)為線性插值'linear'。常用的還有

'time',即根據(jù)時(shí)間間隔進(jìn)行插值。除此之外,method還提供了更高級(jí)的插值方法,比如Scipy庫(kù)中的'nearest'、'zero'、'slinear'、'quadratic'、'cubic'、

'spline'、'barycentric'、'polynomial'等。axis參數(shù)的用法與dropna方法相同。

下面通過(guò)代碼清單演示Pandas提供的處理缺失數(shù)據(jù)方法的用法。

 
 
 
  1. 代碼清單 Pandas處理缺失數(shù)據(jù)方法的用法示例 
  2.  
  3. 1 import pandas as pd 
  4.  
  5. 2 import numpy as np 
  6.  
  7. 3 df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6], 'B': [.25, np.nan,  
  8.  
  9.  np.nan, 4, 12.2]}) 
  10.  
  11. 4 print('df:\n',df) 
  12.  
  13. 5 print('df中的元素是否為缺失值:\n',pd.isna(df)) 
  14.  
  15. 6 df1 = df.fillna(0)#用固定值來(lái)填充 
  16.  
  17. 7 print('用0填充缺失值后的數(shù)據(jù):\n',df1) 
  18.  
  19. 8 df2 = df.fillna(value={'A': 1, 'B': 2}) #將A、B列中的NaN分別替換為1、2 
  20.  
  21. 9 print('用字典填充缺失值后的數(shù)據(jù):\n',df2) 
  22.  
  23. 10 df3 = df.fillna(df.mean()) #用每列的平均值來(lái)填充 
  24.  
  25. 11 print('用每列的平均值填充缺失值后的數(shù)據(jù):\n',df3) 
  26.  
  27. 12 df4 = df.dropna() 
  28.  
  29. 13 print('刪除缺失值后的數(shù)據(jù):\n',df4) 
  30.  
  31. 14 df5=df.interpolate() 
  32.  
  33. 15 print('線性插值法填充缺失值后的數(shù)據(jù):\n',df5) 
  34.  
  35. 16 df6= df.interpolate(method='polynomial',order=2) 
  36.  
  37. 17 print('多項(xiàng)式插值法填充缺失值后的數(shù)據(jù):\n',df6) 

程序執(zhí)行結(jié)束后,輸出結(jié)果如下:

 
 
 
  1. df: 
  2.  
  3.     A        B 
  4.  
  5. 0  1.0     0.25 
  6.  
  7. 1  2.1      NaN 
  8.  
  9. 2  NaN      NaN 
  10.  
  11. 3  4.7     4.00 
  12.  
  13. 4  5.6    12.20 
  14.  
  15. df中的元素是否為缺失值: 
  16.  
  17.     A       B 
  18.  
  19. 0  False  False 
  20.  
  21. 1  False   True 
  22.  
  23. 2   True   True 
  24.  
  25. 3  False  False 
  26.  
  27. 4  False  False 
  28.  
  29. 用0填充缺失值后的數(shù)據(jù): 
  30.  
  31.    A       B 
  32.  
  33. 0  1.0   0.25 
  34.  
  35. 1  2.1   0.00 
  36.  
  37. 2  0.0   0.00 
  38.  
  39. 3  4.7   4.00 
  40.  
  41. 4  5.6  12.20 
  42.  
  43. 用字典填充缺失值后的數(shù)據(jù): 
  44.  
  45.    A      B 
  46.  
  47. 0  1.0   0.25 
  48.  
  49. 1  2.1   2.00 
  50.  
  51. 2  1.0   2.00 
  52.  
  53. 3  4.7   4.00 
  54.  
  55. 4  5.6  12.20 
  56.  
  57. 用每列的平均值填充缺失值后的數(shù)據(jù): 
  58.  
  59.     A          B 
  60.  
  61. 0  1.00   0.250000 
  62.  
  63. 1  2.10   5.483333 
  64.  
  65. 2  3.35   5.483333 
  66.  
  67. 3  4.70   4.000000 
  68.  
  69. 4  5.60  12.200000 
  70.  
  71. 刪除缺失值后的數(shù)據(jù): 
  72.  
  73.    A      B 
  74.  
  75. 0  1.0   0.25 
  76.  
  77. 3  4.7   4.00 
  78.  
  79. 4  5.6  12.20 
  80.  
  81. 線性插值法填充缺失值后的數(shù)據(jù): 
  82.  
  83.    A      B 
  84.  
  85. 0  1.0   0.25 
  86.  
  87. 1  2.1   1.50 
  88.  
  89. 2  3.4   2.75 
  90.  
  91. 3  4.7   4.00 
  92.  
  93. 4  5.6  12.20 
  94.  
  95. 多項(xiàng)式插值法填充缺失值后的數(shù)據(jù): 
  96.  
  97.        A        B 
  98.  
  99. 0  1.000000   0.250 
  100.  
  101. 1  2.100000  -1.975 
  102.  
  103. 2  3.433333  -0.725 
  104.  
  105. 3  4.700000   4.000 
  106.  
  107. 4  5.600000  12.200 

下面對(duì)代碼清單中的代碼做簡(jiǎn)要說(shuō)明。

  • 第3行代碼通過(guò)字典創(chuàng)建了一個(gè)5行2列的DataFrame對(duì)象df,其中使用Numpy庫(kù)中的np.nan設(shè)置了幾個(gè)缺失值,如第4行print函數(shù)的輸出結(jié)果所示。
  • 第5行代碼通過(guò)isna方法來(lái)確認(rèn)df中的哪些元素是缺失值,返回的結(jié)果中,True表示df中對(duì)應(yīng)位置為缺失值,F(xiàn)alse則表示對(duì)應(yīng)位置為正常值。
  • 第6行代碼通過(guò)fillna方法使用固定值0對(duì)df中的缺失值進(jìn)行填充,并將返回結(jié)果賦值給新的DataFrame對(duì)象df1,如第7行print函數(shù)的輸出結(jié)果所示。
  • 第8行代碼通過(guò)fillna方法使用字典{'A': 1, 'B': 2}對(duì)df中的缺失值進(jìn)行填充,A列中的NaN填充為1,B列中的NaN填充為2,并將返回結(jié)果賦值給新的DataFrame對(duì)象df2,如第9行print函數(shù)的輸出結(jié)果所示。
  • 第10行代碼通過(guò)fillna方法,使用df.mean()對(duì)df中的缺失值進(jìn)行填充。df.mean()的返回值是Series對(duì)象類型,表示df每列的平均值,fillna方法再用該平均值對(duì)df每列的缺失值依次進(jìn)行填充,并將返回結(jié)果賦值給新的DataFrame對(duì)象df3,如第11行print函數(shù)的輸出結(jié)果所示。
  • 第12行代碼通過(guò)dropna方法對(duì)df中的缺失值進(jìn)行刪除,采用默認(rèn)的參數(shù)設(shè)置,即刪除所有至少包含一個(gè)缺失值的行,并將返回結(jié)果賦值給新的DataFrame對(duì)象df4,如第13行print函數(shù)的輸出結(jié)果所示。
  • 第14行代碼通過(guò)interpolate方法對(duì)df中的缺失值進(jìn)行插值處理,采用默認(rèn)的參數(shù)設(shè)置,即以列為單位進(jìn)行線性插值,并將返回結(jié)果賦值給新的DataFrame對(duì)象df5,如第15行print函數(shù)的輸出結(jié)果所示。
  • 第16行代碼通過(guò)interpolate方法對(duì)df中的缺失值進(jìn)行了插值處理,參數(shù)method='polynomial'表示采用多項(xiàng)式插值法,order=2指定多項(xiàng)式的階數(shù)為2,并將返回結(jié)果賦值給新的DataFrame對(duì)象df6,如第17行print函數(shù)的輸出結(jié)果所示。

Tips

上文介紹的fillna、dropna、interpolate等處理缺失值的方法都是在數(shù)據(jù)的拷貝上進(jìn)行處理,不會(huì)改變?cè)瓟?shù)據(jù)。

02刪除重復(fù)數(shù)據(jù)

除數(shù)據(jù)缺失之外,數(shù)據(jù)文件中還可能存在重復(fù)的數(shù)據(jù),這會(huì)對(duì)分析結(jié)果產(chǎn)生影響,因此,在數(shù)據(jù)清洗階段還需要?jiǎng)h除重復(fù)數(shù)據(jù)。

要識(shí)別數(shù)據(jù)中是否存在重復(fù)行,可以使用Pandas提供的duplicated方法。常用的語(yǔ)法格式如下:

 
 
 
  1. data.duplicated(subset=None,keep='first',…) 

data可以是一個(gè)Series對(duì)象,也可以是一個(gè)DataFrame對(duì)象,返回值為一個(gè)表示重復(fù)行的布爾類型Series對(duì)象。當(dāng)data是Series對(duì)象時(shí),duplicated方法中沒有subset參數(shù)。subset是列標(biāo)簽參數(shù),表示考慮某些特定列來(lái)標(biāo)識(shí)重復(fù)數(shù)據(jù),缺省時(shí)默認(rèn)為考慮全部列。keep決定標(biāo)記哪個(gè)重復(fù)數(shù)據(jù),缺省時(shí)默認(rèn)為'first',即對(duì)于data中的每一組重復(fù)數(shù)據(jù),第一次出現(xiàn)的位置標(biāo)記為False,其他重復(fù)出現(xiàn)的位置則標(biāo)記為True。keep='last'時(shí)則表示重復(fù)數(shù)據(jù)最后一次出現(xiàn)的位置才標(biāo)記為False,其余位置為True。

可以使用drop_duplicates方法刪除重復(fù)的行,常用的語(yǔ)法格式如下:

 
 
 
  1. result=data.drop_duplicates(subset=None,keep='first',…) 

drop_duplicates方法的參數(shù)含義與duplicated方法相同。keep參數(shù)決定保留哪一行重復(fù)數(shù)據(jù)。返回值為刪掉重復(fù)數(shù)據(jù)的Series或DataFrame對(duì)象。

Pandas還可以利用drop_duplicates方法處理數(shù)據(jù)標(biāo)簽中存在重復(fù)項(xiàng)的情況,具體方法是:先使用Index.duplicated方法確定數(shù)據(jù)標(biāo)簽中是否存在重復(fù)值,然后再利用得到的布爾數(shù)組對(duì)數(shù)據(jù)執(zhí)行行切片。

下面通過(guò)如下代碼清單演示Pandas提供的處理重復(fù)數(shù)據(jù)方法的用法。

 
 
 
  1. 代碼清單 Pandas處理重復(fù)數(shù)據(jù)方法的用法示例 
  2.  
  3. 1 import pandas as pd 
  4.  
  5. 2 df = pd.DataFrame({'brand': ['YumYum', 'YumYum', 'Indomie', 'Indomie',  
  6.  
  7.  'Indomie'], 'style': ['cup', 'cup', 'cup', 'pack', 'pack'], 'rating': [4,  
  8.  
  9.  4, 3.5, 15, 5]},index=['a', 'a', 'b', 'c', 'd']) 
  10.  
  11. 3 print('df:\n',df) 
  12.  
  13. 4 print('對(duì)于全列,df的行中是否存在重復(fù)項(xiàng):\n',df.duplicated()) 
  14.  
  15. 5 df1=df.drop_duplicates() 
  16.  
  17. 6 print('刪除上述重復(fù)項(xiàng)后的df:\n',df1) 
  18.  
  19. 7 print('對(duì)于brand和style列,df的行中是否存在重復(fù)項(xiàng):\n',df.duplicated(subset= ['brand', 'style'])) 
  20.  
  21. 8 df2=df.drop_duplicates(subset= ['brand', 'style']) 
  22.  
  23. 9 print('刪除上述重復(fù)項(xiàng)后的df:\n',df2) 
  24.  
  25. 10 print('df的index是否存在重復(fù)項(xiàng):\n',df.index.duplicated(keep='last')) 
  26.  
  27. 11 df3=df[~df.index.duplicated(keep='last')] 
  28.  
  29. 12 print('刪除index重復(fù)項(xiàng)后的df:\n',df3) 

程序執(zhí)行結(jié)束后,輸出結(jié)果如下:

 
 
 
  1. df: 
  2.  
  3.       brand  style   rating 
  4.  
  5. a    YumYum    cup      4.0 
  6.  
  7. a    YumYum    cup      4.0 
  8.  
  9. b   Indomie    cup      3.5 
  10.  
  11. c   Indomie   pack     15.0 
  12.  
  13. d   Indomie   pack      5.0 
  14.  
  15. 對(duì)于全列,df的行中是否存在重復(fù)項(xiàng): 
  16.  
  17. a    False 
  18.  
  19. a     True 
  20.  
  21. b    False 
  22.  
  23. c    False 
  24.  
  25. d    False 
  26.  
  27. dtype: bool 
  28.  
  29. 刪除上述重復(fù)項(xiàng)后的df: 
  30.  
  31.       brand   style    rating 
  32.  
  33. a    YumYum     cup       4.0 
  34.  
  35. b   Indomie     cup       3.5 
  36.  
  37. c   Indomie    pack      15.0 
  38.  
  39. d   Indomie    pack       5.0 
  40.  
  41. 對(duì)于brand和style列,df的行中是否存在重復(fù)項(xiàng): 
  42.  
  43. a    False 
  44.  
  45. a     True 
  46.  
  47. b    False 
  48.  
  49. c    False 
  50.  
  51. d     True 
  52.  
  53. dtype: bool 
  54.  
  55. 刪除上述重復(fù)項(xiàng)后的df: 
  56.  
  57.       brand   style   rating 
  58.  
  59. a    YumYum     cup      4.0 
  60.  
  61. b   Indomie     cup      3.5 
  62.  
  63. c   Indomie    pack     15.0 
  64.  
  65. df的index是否存在重復(fù)項(xiàng): 
  66.  
  67. [ True False False False False] 
  68.  
  69. 刪除index重復(fù)項(xiàng)后的df: 
  70.  
  71.       brand   style   rating 
  72.  
  73. a    YumYum     cup      4.0 
  74.  
  75. b   Indomie     cup      3.5 
  76.  
  77. c   Indomie    pack     15.0 
  78.  
  79. d   Indomie    pack      5.0 

下面對(duì)代碼清單中的代碼做簡(jiǎn)要說(shuō)明。

  • 第2行代碼通過(guò)字典創(chuàng)建了一個(gè)5行3列的DataFrame對(duì)象df,并設(shè)置index參數(shù)為['a', 'a', 'b', 'c', 'd'],如第3行print函數(shù)的輸出結(jié)果所示。
  • 第4行代碼通過(guò)duplicated方法來(lái)確認(rèn)df中是否存在重復(fù)數(shù)據(jù),采用了默認(rèn)的參數(shù)設(shè)置,即根據(jù)df的所有列來(lái)標(biāo)識(shí)重復(fù)數(shù)據(jù)。對(duì)于df中的每一組重復(fù)數(shù)據(jù),第一次出現(xiàn)的位置標(biāo)記為False,其他重復(fù)出現(xiàn)的位置則標(biāo)記為True,返回值為Series對(duì)象。從print函數(shù)的輸出結(jié)果分析得到,df中的第2行為重復(fù)數(shù)據(jù)。
  • 第5行代碼通過(guò)drop_duplicates方法刪除了第4行代碼中確定的重復(fù)數(shù)據(jù)所在的行,并將返回結(jié)果賦值給新的DataFrame對(duì)象df1,如第6行print函數(shù)的輸出結(jié)果所示。
  • 第7行代碼通過(guò)duplicated方法來(lái)確認(rèn)df中是否存在重復(fù)數(shù)據(jù),subset= ['brand', 'style']表示根據(jù)df的brand和style兩列來(lái)標(biāo)識(shí)重復(fù)數(shù)據(jù)。對(duì)于df中的每一組重復(fù)數(shù)據(jù),第一次出現(xiàn)的位置標(biāo)記為False,其他重復(fù)出現(xiàn)的位置則標(biāo)記為True,返回值為Series對(duì)象。從print函數(shù)的輸出結(jié)果分析得到,df中的第2行和第5行為重復(fù)數(shù)據(jù)。
  • 第8行代碼通過(guò)drop_duplicates方法刪除了第6行代碼中確定的重復(fù)數(shù)據(jù)所在的行,并將返回結(jié)果賦值給新的DataFrame對(duì)象df2,如第9行print函數(shù)的輸出結(jié)果所示。
  • 第10行代碼通過(guò)duplicated方法來(lái)確認(rèn)df.index(即df的行標(biāo)簽)中是否存在重復(fù)項(xiàng),keep='last'表示對(duì)于df.index中的每一組重復(fù)數(shù)據(jù),最后一次出現(xiàn)的位置標(biāo)記為Fasle,其他重復(fù)出現(xiàn)的位置則標(biāo)記為True,返回值為一維布爾數(shù)組。從print函數(shù)的輸出結(jié)果分析得到,df中第1行的行標(biāo)簽為重復(fù)項(xiàng)。
  • 第11行代碼通過(guò)布爾數(shù)組切片的方法刪除了df中行標(biāo)簽重復(fù)的行。首先對(duì)第10行代碼得到的布爾數(shù)組進(jìn)行取反操作,即將第1行重復(fù)項(xiàng)標(biāo)記為Fasle,其他項(xiàng)標(biāo)記為True;然后再利用得到的新布爾數(shù)組對(duì)df進(jìn)行切片,截取True對(duì)應(yīng)的行,并將返回結(jié)果賦值給新的DataFrame對(duì)象df3,如第12行print函數(shù)的輸出結(jié)果所示。

Tips

1)上文介紹的drop_duplicates方法也是在數(shù)據(jù)的拷貝上進(jìn)行刪除,不會(huì)改變?cè)瓟?shù)據(jù)。
2)Pandas還提供了del和drop等方法,通過(guò)位置索引或標(biāo)簽索引刪除數(shù)據(jù)中的指定行或列。

本文摘編于《Python數(shù)據(jù)分析與應(yīng)用》,經(jīng)出版方授權(quán)發(fā)布。


當(dāng)前標(biāo)題:兩大步驟,29行代碼學(xué)會(huì)數(shù)據(jù)清洗
轉(zhuǎn)載注明:http://m.5511xx.com/article/cdjshps.html