DataWhale组队-Pandas(下)缺失数据(打卡)
1.缺失值概要
數據的缺失主要包括記錄的缺失和記錄中某個字段信息的缺失,兩者都會造成分析結果的不準確,以下從缺失值產生的原因及影響扥方面展開分析。
(1)缺失值產生的原因
1)有些信息暫時無法獲取,或者獲取信息的代價太大;
2)有些信息是被遺漏的。可能是因為輸入時認為不重要、忘記填寫或對數據理解錯誤等一些人為因素而遺漏,也可能是由于數據采集設置的故障、存儲介質的故障、傳輸媒體的故障燈非人為原因而丟失;
3)屬性值不存在。在某些情況下,缺失值并不意味著數據有錯誤。對一些對象來說某些屬性是不存在的,如一個未婚者的配偶姓名、一個兒童的固定收入等。
(2)缺失值的影響
1)數據挖掘建模將丟失大量的有用信息;
2)數據挖掘模型所表現出的不確定性更加顯著,模型中蘊涵的規律更難把握。
3)包含空值的數據會使建模過程陷入混亂,導致不可靠的輸出。
(3)缺失值的分析
使用簡單的統計分析,可以得到含有缺失值的屬性的個數,以及每個屬性的未缺失數、缺失數與缺失率等。
從總體上來說,缺失值的處理分為刪除存在缺失值的記錄、對可能值進行插補和不處理3種情況。
2.缺失值處理
import pandas as pd import numpy as np df = pd.read_csv('data/table_missing.csv') #默認輸出DataFrame的前5行 df.head()(1)了解缺失數據
函數isna和notna方法
df['Physics'].isna().head() df['Physics'].notna().head()統計每列(每行)的缺失情況
#統計每列的缺失 df.isna().sum()#或者df.isnull().sum() #統計每行的缺失 df.isna(axis=0).sum()#或者df.isnull(axis=0).sum()挑出該列缺失值的行
df[df['Physics'].isna()]挑選出所有非缺失值的列
這里介紹了all和any的用法,all是全部值,any是至少有一個值
#all是全部非缺失值 df[df.notna().all(1)] #any至少有一個不是缺失值 df[df.notna().any(1)](2)三種缺失符號
(a)np.nan
它不等與任何東西,甚至不等于自己?
在用equals函數比較時,自動略過兩側全是np.nan的單元格
? ? ? ? 在numpy中的類型為浮點,由此導致數據集讀入時,即使原來是整數的列,只要有缺失值就會變為浮點型
? ? ? ??對于布爾類型的列表,如果是np.nan填充,那么它的值會自動變為True而不是False,但當修改一個布爾列表時,會改變列表類型,而不是賦值為True
? ? ? ? ?在所有的表格讀取后,無論列是存放什么類型的數據,默認的缺失值全為np.nan類型,因此整型列轉為浮點;而字符由于無法轉化為浮點,因此只能歸并為object類型('O'),原來是浮點型的則類型不變。
? ? ? ? ?(b)None
? ? ? ? ? ?None比前者稍微好些,至少它會等于自身
? ? ? ? ? ?它的布爾值為False
? ? ? ? ? ?修改布爾列表不會改變數據類型
? ? ? ? ? ?在傳入數值類型后,會自動變為np.nan
? ? ? ? ? 只有當傳入object類型是保持不動,幾乎可以認為,除非人工命名None,它基本不會自動出現在Pandas中
? ? ? ? ? ?在使用equals函數時不會被略過,因此下面的情況下返回False?
? ? ? ? (c)NaT
? ? ? ? ? ?NaT是針對時間序列的缺失值,是Pandas的內置類型,可以完全看做時序版本的np.nan,與自己不等,且使用equals是也會被跳過。
? ? ? ? (3)Nullable類型與NA符號
? ? ? ? (a)Nullable整形
? ? ? ? ? 對于該種類型而言,它與原來標記int上的符號區別在于首字母大寫:‘Int’,好處在于缺失值的類型都被替換成統一的NA符號,且不改變數據類型。
(b)Nullable布爾?
與Nullable整型一致,且數據類型不會變成浮點型
(c)string類型
為了區分開原本含糊不清的object類型,它本質上也屬于Nullable類型,因為不會含有缺失而改變類型;
與object類型的一點重要區別就在于,在調用字符方法后,string類型返回的是Nullable類型,object則會根據缺失類型和數據類型而改變。
(4)NA的特性
(a)邏輯運算
只需看該邏輯運算的結果是否依賴pd.NA的取值,如果依賴,則結果還是NA,如果不依賴,則直接計算結果,取值不明直接報錯
(b)算術運算和比較運算
當出現pd.NA**0和1**pd.NA時結果為1,其他情況為NA
(5)convert_dtypes方法
在讀取數據時,就把數據列轉為Nullable,是pandas1.0的新函數。
pd.read_csv('data/table_missing.csv').convert_dtypes().dtypes3.缺失數據的運算與分組
(a)加號和乘號規則
使用加法時,缺失值為0;
使用乘法時,缺失值為1;
使用累計函數時,缺失值自動略過
(b)groupby方法中的缺失值
自動忽略為缺失值的組
df_g = pd.DataFrame({'one':['A','B','C','D',np.nan],'two':np.random.randn(5)}) print(df_g) df_g.groupby('one').groups4.填充與剔除
(a)fillna方法(值填充與前后向填充,methods=ffill or bfill)
#值填充 df['Physics'].fillna('missing').head() #前向填充 df['Physics'].fillna(method='ffill').head() #后向填充 df['Physics'].fillna(method='backfill').head()指定列填充
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()) #填充A,B兩列 df_f.fillna(df_f.mean()[['A','B']])(b)dropna方法
axis參數是行或列的參數,如果axis=0,則對應是每一行,如果axis=1,則對應沒一列
how參數是可以選擇all或者是any,表示全為缺失去除或存在缺失去除
subset參數是在某一列范圍中搜索缺失值
5.插值(interpolation)
常見的數據插補方法有:
(1)線性插值
(a)與索引無關的線性插值
默認狀態下,interpolate會對缺失的值進行線性插值
s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28]) s.interpolate()(b)與索引有關的線性插值
method中的index和time選項可以是插值線性地依賴索引,即插值為索引的線性函數
s.interpolate(method='index')如果索引是時間,那么可以按照時間長短插值。
s_t = pd.Series([0,np.nan,10],index=[pd.Timestamp('2012-05-01'),pd.Timestamp('2012-05-07'),pd.Timestamp('2012-06-03')]) #未按照time插值(圖1) s_t.interpolate() #按照time插值(圖2) s_t.interpolate(method='time')?
(2)高級插值方法
與線性插值相比較,例如樣條插值、多項式插值、阿基瑪插值等,可進一步學習。
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.nan methods = ['linear', 'quadratic', 'cubic'] df = pd.DataFrame({m: ser.interpolate(method=m) for m in methods}) df.plot()(3)interpolate的限制參數
(a)limit最多插入多少個,s.interpolate(limit=2)
(b)limit_direction表示插值方向,可選forword,backward,both,默認前向,s.interpolate(limit_direction='backward')
(c)limit_area表示插值區域,可選inside,outside,默認None,s.interpolate(limit_area='inside')
練習題:
(1)如何刪除缺失值在25%以上的列
s.drop(s.columns[s.isna().sum()/s.shape[0]>0.25],axis=1)
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的DataWhale组队-Pandas(下)缺失数据(打卡)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: higtech软件的使用
- 下一篇: Cocos2d-x中的BMFont(Fn