數據分析之Pandas缺失數據處理

2021-02-21 Datawhale
基礎概念

首先,對缺失值分類和缺失值處理方法進行講解。

缺失值的分類

按照數據缺失機制可分為:

可忽略的缺失

完全隨機缺失(missing completely at random, MCAR),所缺失的數據發生的概率既與已觀察到的數據無關,也與未觀察到的數據無關

隨機缺失(missing at random, MAR),假設缺失數據發生的概率與所觀察到的變量是有關的,而與未觀察到的數據的特徵是無關的。

不可忽略的缺失(non-ignorable missing ,NIM) 或非隨機缺失(not missing at random, NMAR, or, missing not at random, MNAR),如果不完全變量中數據的缺失既依賴於完全變量又依賴於不完全變量本身,這種缺失即為不可忽略的缺失。

【注意】:Panda讀取的數值型數據,缺失數據顯示「NaN」(not a number)。

數據值的處理方法

主要就是兩種方法:

【注意】缺失值的插補只能用於客觀數據。由於主觀數據受人的影響,其所涉及的真實值不能保證。

簡單刪除法是對缺失值進行處理的最原始方法。它將存在缺失值的個案刪除。如果數據缺失問題可以通過簡單的刪除小部分樣本來達到目標,那麼這個方法是最有效的。

當缺失值的類型為非完全隨機缺失的時候,可以通過對完整的數據加權來減小偏差。把數據不完全的個案標記後,將完整的數據個案賦予不同的權重,個案的權重可以通過logistic或probit回歸求得。如果解釋變量中存在對權重估計起決定行因素的變量,那麼這種方法可以有效減小偏差。如果解釋變量和權重並不相關,它並不能減小偏差。

對於存在多個屬性缺失的情況,就需要對不同屬性的缺失組合賦不同的權重,這將大大增加計算的難度,降低預測的準確性,這時權重法並不理想。

2、可能值插補缺失值

【思想來源】:以最可能的值來插補缺失值比全部刪除不完全樣本所產生的信息丟失要少。

屬於單值插補。數據的屬性分為定距型和非定距型。如果缺失值是定距型的,就以該屬性存在值的平均值來插補缺失的值;如果缺失值是非定距型的,就用該屬性的眾數來補齊缺失的值。

(2)利用同類均值插補

屬於單值插補。用層次聚類模型預測缺失變量的類型,再以該類型的均值插補。假設

(3)極大似然估計(Max Likelihood ,ML)

在缺失類型為隨機缺失的條件下,假設模型對於完整的樣本是正確的,那麼通過觀測數據的邊際分布可以對未知參數進行極大似然估計(Little and Rubin)。這種方法也被稱為忽略缺失值的極大似然估計,對於極大似然的參數估計實際中常採用的計算方法是期望值最大化(Expectation Maximization,EM)。該方法比刪除個案和單值插補更有吸引力,前提是適用於大樣本,有效樣本的數量足夠以保證ML估計值是漸近無偏的並服從正態分布。這種方法可能會陷入局部極值,收斂速度也不是很快,並且計算很複雜。

(4)多重插補(Multiple Imputation,MI)

多值插補的思想來源於貝葉斯估計,認為待插補的值是隨機的,它的值來自於已觀測到的值。具體實踐上通常是估計出待插補的值,然後再加上不同的噪聲,形成多組可選插補值。根據某種選擇依據,選取最合適的插補值。

多重插補方法的三個步驟:

多重插補方法舉例:

假設一組數據,包括三個變量

多重插補彌補貝葉斯估計的不足之處:

貝葉斯估計以極大似然的方法估計,極大似然的方法要求模型的形式必須準確,如果參數形式不正確,將得到錯誤得結論,即先驗分布將影響後驗分布的準確性。而多重插補所依據的是大樣本漸近完整的數據的理論,在數據挖掘中的數據量都很大,先驗分布將極小的影響結果,所以先驗分布的對結果的影響不大。

貝葉斯估計僅要求知道未知參數的先驗分布,沒有利用與參數的關係。而多重插補對參數的聯合分布作出了估計,利用了參數間的相互關係。

缺失觀測及其類型

首先導入數據:

import pandas as pdimport numpy as npdf = pd.read_csv('data/table_missing.csv')df.head()

了解缺失信息1、isna和notna方法對Series使用會返回布爾列表

df['Physics'].isna().head()

df['Physics'].notna().head()

對DataFrame使用會返回布爾表

但對於DataFrame我們更關心到底每列有多少缺失值

此外,可以通過第1章中介紹的info函數查看缺失信息

2、查看缺失值的所以在行以最後一列為例,挑出該列缺失值的行

3、挑選出所有非缺失值列

使用all就是全部非缺失值,如果是any就是至少有一個不是缺失值

三種缺失符號

1、np.nannp.nan是一個麻煩的東西,首先它不等與任何東西,甚至不等於自己。

False

False

False

在用equals函數比較時,自動略過兩側全是np.nan的單元格,因此結果不會影響。

True

其次,它在numpy中的類型為浮點,由此導致數據集讀入時,即使原來是整數的列,只要有缺失值就會變為浮點型。

float

dtype('int64')

pd.Series([1,np.nan,3]).dtype

dtype('float64')

此外,對於布爾類型的列表,如果是np.nan填充,那麼它的值會自動變為True而不是False。
pd.Series([1,np.nan,3],dtype='bool')

但當修改一個布爾列表時,會改變列表類型,而不是賦值為True。
s = pd.Series([True,False],dtype='bool')s[1]=np.nans

在所有的表格讀取後,無論列是存放什麼類型的數據,默認的缺失值全為np.nan類型。

因此整型列轉為浮點;而字符由於無法轉化為浮點,因此只能歸併為object類型('O'),原來是浮點型的則類型不變

dtype('float64')

dtype('float64')

dtype('O')

2、NoneNone比前者稍微好些,至少它會等於自身

True

它的布爾值為False
pd.Series([None],dtype='bool')

0 False
dtype: bool

修改布爾列表不會改變數據類型
s = pd.Series([True,False],dtype='bool')s[0]=Nones

0 False
1 False
dtype: bool

s = pd.Series([1,0],dtype='bool')s[0]=Nones

0 False
1 False
dtype: bool

在傳入數值類型後,會自動變為np.nan
type(pd.Series([1,None])[1])

numpy.float64

只有當傳入object類型是保持不動,幾乎可以認為,除非人工命名None,它基本不會自動出現在Pandas中
type(pd.Series([1,None],dtype='O')[1])

NoneType

在使用equals函數時不會被略過,因此下面的情況下返回False
pd.Series([None]).equals(pd.Series([np.nan]))

False

3、NaTNaT是針對時間序列的缺失值,是Pandas的內置類型,可以完全看做時序版本的np.nan,與自己不等,且使用equals是也會被跳過
s_time = pd.Series([pd.Timestamp('20120101')]*5)s_time

pandas._libs.tslibs.nattype.NaTType

False

True

s = pd.Series([True,False],dtype='bool')s[1]=pd.NaTs

Nullable類型與NA符號

這是Pandas在1.0新版本中引入的重大改變,其目的就是為了(在若干版本後)解決之前出現的混亂局面,統一缺失值處理方法。"The goal of pd.NA is provide a 「missing」 indicator that can be used consistently across data types (instead of np.nan, None or pd.NaT depending on the data type)."——User Guide for Pandas v-1.0官方鼓勵用戶使用新的數據類型和缺失類型pd.NA1、Nullable整形對於該種類型而言,它與原來標記int上的符號區別在於首字母大寫:'Int'
s_original = pd.Series([1, 2], dtype="int64")s_original

s_new = pd.Series([1, 2], dtype="Int64")s_new

它的好處就在於,其中前面提到的三種缺失值都會被替換為統一的NA符號,且不改變數據類型。

s_original[1] = np.nans_original

2、Nullable布爾對於該種類型而言,作用與上面的類似,記號為boolean
s_original = pd.Series([1, 0], dtype="bool")s_original

s_new = pd.Series([0, 1], dtype="boolean")s_new

s_original[0] = np.nans_original

s_original = pd.Series([1, 0], dtype="bool") #此處重新加一句是因為前面賦值改變了bool類型s_original[0] = Nones_original

需要注意的是,含有pd.NA的布爾列表在1.0.2之前的版本作為索引時會報錯,這是一個之前的bug,現已經修復。
s = pd.Series(['dog','cat'])s[s_new]

3、string類型

該類型是1.0的一大創新,目的之一就是為了區分開原本含糊不清的object類型,這裡將簡要地提及string,因為它是第7章的主題內容。它本質上也屬於Nullable類型,因為並不會因為含有缺失而改變類型。
s = pd.Series(['dog','cat'],dtype='string')s

此外,和object類型的一點重要區別就在於,在調用字符方法後,string類型返回的是Nullable類型,object則會根據缺失類型和數據類型而改變。

s = pd.Series(["a", None, "b"], dtype="string")s.str.count('a')

s2 = pd.Series(["a", None, "b"], dtype="object")s2.str.count("a")

NA的特性
1、邏輯運算只需看該邏輯運算的結果是否依賴pd.NA的取值,如果依賴,則結果還是NA,如果不依賴,則直接計算結果。

True

True

<NA>

False

<NA>

取值不明直接報錯2、算術運算和比較運算這裡只需記住除了下面兩類情況,其他結果都是NA即可

1

1

其他情況:

<NA>

<NA>

<NA>

<NA>

<NA>

<NA>

convert_dtypes方法這個函數的功能往往就是在讀取數據時,就把數據列轉為Nullable類型,是1.0的新函數。
pd.read_csv('data/table_missing.csv').dtypes

pd.read_csv('data/table_missing.csv').convert_dtypes().dtypes

缺失數據的運算與分組加號與乘號規則使用加法時,缺失值為0
s = pd.Series([2,3,np.nan,4])s.sum()

9.0

使用乘法時,缺失值為1

24.0

使用累計函數時,缺失值自動略過

groupby方法中的缺失值
自動忽略為缺失值的組
df_g = pd.DataFrame({'one':['A','B','C','D',np.nan],'two':np.random.randn(5)})df_g

df_g.groupby('one').groups

填充與剔除
fillna方法1、值填充與前後向填充(分別與ffill方法和bfill方法等價)
df['Physics'].fillna('missing').head()

df['Physics'].fillna(method='ffill').head()

df['Physics'].fillna(method='backfill').head()

2、填充中的對齊特性

df_f = pd.DataFrame({'A':[1,3,np.nan],'B':[2,4,np.nan],'C':[3,5,np.nan]})df_f.fillna(df_f.mean())

返回的結果中沒有C,根據對齊特點不會被填充

df_f.fillna(df_f.mean()[['A','B']])

dropna方法

1、axis參數
df_d = pd.DataFrame({'A':[np.nan,np.nan,np.nan],'B':[np.nan,3,2],'C':[3,2,1]})df_d

2、how參數(可以選all或者any,表示全為缺失去除和存在缺失去除)

df_d.dropna(axis=1,how='all')

3、subset參數(即在某一組列範圍中搜索缺失值)¶
df_d.dropna(axis=0,subset=['B','C'])

插值
線性插值1、索引無關的線性插值默認狀態下,interpolate會對缺失的值進行線性插值
s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])s

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7df20af50>

此時的插值與索引無關
s.index = np.sort(np.random.randint(50,300,8))s.interpolate()#值不變

s.interpolate().plot()#後面三個點不是線性的(如果幾乎為線性函數,請重新運行上面的一個代碼塊,這是隨機性導致的)

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dfc69890>

2、與索引有關的插值method中的index和time選項可以使插值線性地依賴索引,即插值為索引的線性函數
s.interpolate(method='index').plot()#可以看到與上面的區別

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dca0c4d0>

如果索引是時間,那麼可以按照時間長短插值,對於時間序列將在第9章詳細介紹
s_t = pd.Series([0,np.nan,10]        ,index=[pd.Timestamp('2012-05-01'),pd.Timestamp('2012-05-07'),pd.Timestamp('2012-06-03')])s_t

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dc964850>

s_t.interpolate(method='time').plot()

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dc8eda10>

高級插值方法此處的高級指的是與線性插值相比較,例如樣條插值、多項式插值、阿基瑪插值等(需要安裝Scipy)。關於這部分僅給出一個官方的例子,因為插值方法是數值分析的內容,而不是Pandas中的基本知識:
ser = pd.Series(np.arange(1, 10.1, .25) ** 2 + np.random.randn(37))missing = np.array([4, 13, 14, 15, 16, 17, 18, 20, 29])ser[missing] = np.nanmethods = ['linear', 'quadratic', 'cubic']df = pd.DataFrame({m: ser.interpolate(method=m) for m in methods})df.plot()

<matplotlib.axes._subplots.AxesSubplot at 0x7fe7dc86f810>

interpolate中的限制參數1、limit表示最多插入多少個
s = pd.Series([1,np.nan,np.nan,np.nan,5])s.interpolate(limit=2)

2、limit_direction表示插值方向,可選forward,backward,both,默認前向。
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])s.interpolate(limit_direction='backward')

3、limit_area表示插值區域,可選inside,outside,默認None
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])s.interpolate(limit_area='inside')

s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])s.interpolate(limit_area='outside')

問題與練習

問題

第一步,計算單列缺失值的數量,計算單列總樣本數

第二步,算出比例,得到一個列的布爾列表

第三步,利用這個布爾列表進行列索引或列刪除

df.loc[:,(df.isna().sum()/df.isna().count()<0.25).values]

【問題二】 什麼是Nullable類型?請談談為什麼要引入這個設計?

Nullable類型是一種為了統一NaN,Null,NaT三類缺失值而誕生的新的類型。是在原來的數值、布爾、字符等類型的基礎上進行小改,優化了當出現缺失值情況時的應對。引入這個設計時為了更好的處理缺失值,統一缺失值處理方法

【問題三】 對於一份有缺失值的數據,可以採取哪些策略或方法深化對它的了解?

可以查看缺失值出現的比例;

查看缺失值之間的關聯性;

查看總體的缺失信息;

根據缺失信息判斷是否為有效數據;

根據缺失信息清洗數據等等。

練習

【練習一】現有一份虛擬數據集,列類型分別為string/浮點/整型,請解決如下問題。

q1 = pd.read_csv('data/Missing_data_one.csv')q1.head()

      A       B     C0  not_NaN  0.922  4.01  not_NaN  0.700  NaN2  not_NaN  0.503  8.03  not_NaN  0.938  4.04  not_NaN  0.952  10.0

1.1 請以列類型讀入數據,並選出C為缺失值的行。

1.2 現需要將A中的部分單元轉為缺失值,單元格中的最小轉換概率為25%,且概率大小與所在行B列單元的值成正比

q1['A'] = pd.Series(list(zip(q1['A'].values,q1['B'].values))).apply(lambda x:x[0] if np.random.rand()>0.25*x[1]/q1['B'].min() else np.nan)

【練習二】 現有一份缺失的數據集,記錄了36個人來自的地區、身高、體重、年齡和工資,解決如下問題:
pd.read_csv('data/Missing_data_two.csv').head()

  編號 地區 身高    體重   年齡   工資0  1   A   157.50  NaN    47.0  15905.01  2   B   202.00  91.80  25.0  NaN2  3   C   169.09  62.18  NaN   NaN3  4   A   166.61  59.95  77.0  5434.04  5   B   185.19  NaN    62.0  4242.0

2.1 統計各列缺失的比例並選出在後三列中至少有兩個非缺失值的行

q2.isna().sum()/q2.shape[0]q2[q2.iloc[:,-3:].isna().sum(1)<=1].head()

2.2 請結合身高列和地區列中的數據,對體重進行合理插值

q2_new = q2.copy()for area,group in q2.groupby('地區'):    q2_new.loc[group.index,'體重'] = group[['身高','體重']].sort_values(by='身高').interpolate()['體重'] q2_new = q2_new.round(decimals=2)q2_new.head()

本文電子版 後臺回復 缺失數據 獲取

「感謝你的在看,點讚,分享三

相關焦點

  • Python學習指南| 快速入門Pandas數據分析技巧
    數據科學家經常使用以.csv,.tsv或.xlsx等表格格式存儲的數據。Pandas使用類似SQL的查詢加載,處理和分析表格數據非常方便。它能完成許多任務,為數據分析提供了廣泛的手段。包括:雖然pandas功能非常強大,但它不能為整個數據科學管道pipeline提供函數。
  • 手把手教你用pandas處理缺失值
    pandas對象的所有描述性統計信息默認情況下是排除缺失值的。pandas對象中表現缺失值的方式並不完美,但是它對大部分用戶來說是有用的。對於數值型數據,pandas使用浮點值NaN(Not a Number來表示缺失值)。
  • 數據分析之Pandas合併操作總結
    ,它的使用基礎是Numpy(提供高性能的矩陣運算),用於數據挖掘和數據分析,同時也提供數據清洗功能。Pandas做分析數據,可以分為索引、分組、變形及合併四種操作。這個例子就是,我們如果update了缺失值NaN,則就不會在原df1中把對應元素改成NaN了,這個缺失值是不會被填充的。
  • 使用Pandas進行數據處理
    引言我們將深入講解pandas庫在數據處理階段的功能數據處理又可以細分為三個階段,我們將通過例子詳細講解各個階段都會涉及哪些操作,以及如何充分利用pandas庫提供的函數來完成這些操作。數據處理的三個階段為:數據準備、數據轉換和數據聚合。數據準備開始處理數據工作之前,需要先行準備好數據,把數據組裝成便於用pandas庫的各種工具處理的數據結構。
  • 使用Pandas數據處理與分析
    前言:這是關於個人關於對pandas可以進行的數據處理和數據分析的見解的初版,其中肯定不乏一些錯誤之處,希望大家能多多指正。pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數。這些pandas的解析函數參數較為複雜,具體了解可以在pandas官網上自行查閱,或者可以再Jupyter Notebook 中採用help(pd.read_excel)命令查閱。2.審閱數據在成功導入數據以後,需要對數據進行審閱,目的是,了解數據結構、類型、大小等情況。
  • 數據分析之Pandas變形操作總結
    ;它的使用基礎是Numpy(提供高性能的矩陣運算);用於數據挖掘和數據分析,同時也提供數據清洗功能。Dummy Variable(啞變量)   3.2. factorize方法在詳細講解每個模塊之前,首先讀入數據:import numpy as npimport pandas as pddf = pd.read_csv('joyful-pandas-master/data/table.csv
  • Python數據分析之pandas數據讀寫
    引言我們現在已經基本熟悉了pandas庫以及它所提供的用於數據分析的基礎功能,也知道了DataFrame和Series是這個庫的核心,數據處理、計算和分析都是圍繞他們展開的。本節將學習pandas從多種存儲媒介(比如文件和資料庫)讀取數據的工具,還將學到直接將不同的數據結構寫入不同格式文件的方法,而無需過多考慮所使用的技術。本節的主要內容為pandas的多種I/O API函數,它們為大多數常用格式的數據作為DataFrame對象進行讀寫提供了很大便利。
  • 數據分析之Pandas
    當你用Pandas輕鬆處理excel、csv等格式的數據時,當你縱享絲滑時,你真的會愛上編程的 手動斜眼笑。Pandas 是基於NumPy ,為解決數據分析任務而創建的一種工具。Pandas 納入了大量庫和一些標準的數據模型,pandas提供了大量能使我們快速便捷地處理數據的函數和方法。所以下面首先介紹pandas最常用的2種基本數據格式[1],然後說明如何從文件中導入數據[2],最後總結了一些最常用的函數[3]。
  • 關於Pandas數據處理你不知道的技巧!
    ,因為它不像Boston房價數據(Kaggle最經典的題目)集那樣處理得很好。首先,我將討論如何處理缺失數據。DataFrame.isna()DataFrame.fillna()我們可以使用 pandas.Datafram.isna() 來檢測類似數組對象的缺失值。它將返回一個大小相同的布爾對象,其其中NA值(如None或 numpy.NaN)將映射為True,其他所有值都映射為False。
  • pandas讀取表格後的常用數據處理操作
    pandas讀取表格後的一些常用數據處理操作。這篇文章其實來源於自己的數據挖掘課程作業,通過完成老師布置的作業,感覺對於使用python中的pandas模塊讀取表格數據進行操作有了更深層的認識,這裡做一個整理總結。
  • 用Pandas做數據清洗的常用操作!
    pandas數據清洗的乾貨作為一名數據分析師,每天都在完成各種數據分析需求,其中數據清洗是必不可少的一個步驟。一般而言,當提及數據清洗時,其實是主要包括了缺失值處理、重複值處理和異常值處理三類操作,本文即圍繞這這三個方面介紹一下個人的一些習慣操作。01 缺失值處理缺失值是各類數據集中經常會遇到的情形,相較於工整完全的數據記錄,帶有一定的缺失值更接近於數據的真實原貌。
  • 【數據分析】Pandas
    數據分組和聚合其他常用方法                ✦ ✦ ✦ ✦ ✦ ✦1、簡介pandas是一個強大的Python數據分析的工具包,它是基於Numpy構建的,正因pandas的出現,讓Python語言也成為使用最廣泛而且強大的數據分析環境之一。
  • python數據分析之pandas常用命令整理
    pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。你很快就會發現,它是使Python成為強大而高效的數據分析環境的重要因素之一。
  • Pandas對文本數據處理
    在處理數據的時候,對數值型的數據處理還是比較方便的,但是有時候數值型數據出現問題後就會比較頭痛了,因為文本數據的排列組合可是有很多很多的,今天我們就學習一下如何對文本數據進行處理,這樣我們接下來在工作中遇到了這些情況就可以少掉一下頭髮啦。
  • 數據處理技巧 | 帶你了解Pandas.groupby() 常用數據處理方法
    今天我們繼續推出一篇數據處理常用的操作技能匯總:靈活使用pandas.groupby()函數,實現數據的高效率處理,主要內容如下:pandas.groupby()三大主要操作介紹說到使用Python進行數據處理分析,那就不得不提其優秀的數據分析庫-Pandas,
  • Python數據分析利器,Pandas入門介紹,幫你便捷高效處理複雜數據
    關於Python的數據分析,當我們遇到的數據量小、數據結構簡單時,可以通過字典、列表等Python常見的數據結構來處理。但是當我們面對的大量數據以及複雜數據的局面時,就需要用一些專門用於數據分析的擴展庫來處理數據了。今天給大家介紹一個Python裡專門用來做數據分析和處理的擴展庫。
  • Python數學建模技巧之pandas數據處理
    最常見的庫有進行矩陣運算的Numpy、進行數據處理的pandas、進行科學計算的Scipy、進行圖形繪製及科學可視化的matplotlib、進行符號計算的Sympy以及方便進行機器學習任務的Sklearn。由於今年美賽官方公告中稱,將會提前在賽題公布之前就提供下載C題數據集的方式。
  • 《pandas數據讀取》
    今天呢就給大家分享一個數據分析裡面的基礎內容之pandas數據讀取 數據讀取是進行數據預處理,建模與分析的前提,不同的數據源
  • 玩轉數據處理120題|Pandas&R
    和我一起玩Python本文精心挑選在數據處理中常見的120種操作並整理成習題發布。
  • 數據科學 | 手把手教你用 pandas 索引、匯總和處理缺失數據
    pandas作為python中非常重要的數據處理工具,它提供了很多靈活的數學和統計方法。在數據處理中,經常需要對數據進行索引的轉換,以適應不同的統計和作圖的需要;另外在許多數據分析工作中,缺失數據是經常發生的。因此,作為pandas系列文章的一部分,本文將重點關注pandas對數據索引、匯總和缺失數據的處理的相關方法。