pandas1 0 5學習筆記(六)缺失資料

2021-10-07 11:08:15 字數 3019 閱讀 5114

知識總結

問題參考

缺失資料處理:在資料處理過程中,缺失資料(missing value)的處理設計刪除,替換,差值等操作,這些操作過程中又可能涉及資料型別的改變,可能會導致資料的丟失/破壞。在新版本pandas1.0.5中提出了nullable型別資料,來(在若干版本之後)解決之前的混亂局面。

這是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.na

nullable型別包含:nullable整型(int64),布林型(boolean),string型

pandas1.0版本之前,np.nan,none,np.nat在資料與處理的過程中會因為一些操作改變資料型別,以致於資料的使用不便。有了nullable型別之後,有了統一的確實型別pd.na,在進行資料的處理過程中,即使使用了np.nan,none,np.nat去改變資料,df中總是儲存na,且不會改變資料型別。

此外,由於nuallable型別的出現,有string型別的資料,解決了object型別資料在呼叫字元方法後,會根據缺失型別和資料型別而改變的問題,而string型別返回的是nullable型別。

(a)isna和notna方法:

df.isna()/df.notna()

(b)檢視缺失值的所以在行:

df[df[『***』].isna()]

(c)挑選出所有非缺失值列:

df[df.notna().all(1)]/df[df.notna().any(1)]

(a)nullable整形(int64)

對於該種型別而言,它與原來標記int上的符號區別在於首字母大寫:『int』。

有時候有缺失值時,缺失值用 np.nan 會把整列當作float處理,這樣對id類資料會有問題(如身份證號碼轉成float再轉成str或int,原有資料可能丟失了),所以提供了乙個「int64」來處理缺失值,大小寫可能是為了區分pandas中的64位整型int64和numpy中的64位整型int64,而numpy的int64對缺失值的支援不好。

它的好處就在於,其中前面提到的三種缺失值都會被替換為統一的na符號,且不改變資料型別

(b)nullable布林

對於該種型別而言,作用與上面的類似,記號為boolean

(c)string型別

該型別是1.0的一大創新,目的之一就是為了區分開原本含糊不清的object型別,它本質上也屬於nullable型別,因為並不會因為含有缺失而改變型別

此外,和object型別的一點重要區別就在於,在呼叫字元方法後,string型別返回的是nullable型別,object則會根據缺失型別和資料型別而改變

(a)邏輯運算

只需看該邏輯運算的結果是否依賴pd.na的取值,如果依賴,則結果還是na,如果不依賴,則直接計算結果

(b)算術運算和比較運算

這裡只需記住除了下面兩類情況,其他結果都是na即可

pd.na ** 0 = 1	

1 ** pd.na =1

這個函式的功能往往就是在讀取資料時,就把資料列轉為nullable型別,是1.0的新函式:df.convert_dtypes()

加號與乘號規則

groupby方法中的缺失值

fillna方法

(a)值填充與前後向填充

(b)填充中的對齊特性

dropna方法

(a)axis引數,預設為any

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

線性插值

(a)索引無關的線性插值

預設狀態下,interpolate會對缺失的值進行線性插值

(b)與索引有關的插值

method中的index和time選項可以使插值線性地依賴索引,即插值為索引的線性函式

高階插值方法

此處的高階指的是與線性插值相比較,例如樣條插值、多項式插值、阿基瑪插值等(需要安裝scipy),方法詳情請看這裡

關於這部分僅給出乙個官方的例子,因為插值方法是數值分析的內容,而不是pandas中的基本知識:

interpolate中的限制引數

(a)limit表示最多插入多少個

(b)limit_direction表示插值方向,可選forward,backward,both,預設前向

(c)limit_area表示插值區域,可選inside,outside,預設none

def drop_col(df, col_name, cutoff=0.5):

n = len(df)

cnt = df[col_name].count()

if (float(cnt) / n) < cutoff:

df.drop(col_name, axis=1, inplace=1)

drop_col(df, 'col_1', cutoff=0.75)

min_b = df['b'].min()
df_method_1 = df.copy()

for name,group in df_method_1.groupby('地區'):

df_method_1.loc[group.index, '體重'] = group[['身高','體重']].sort_values(by='身高').interpolate()['體重']

df_method_1['體重'] = df_method_1['體重'].round(decimals=2)

[1]

[2]

pandas學習筆記

import numpy as np import pandas as pd obj2 pd.series 4,7,5,3 index d b a c obj2 out 99 d 4 b 7 a 5 c 3 dtype int64 a b pd.series a bout 102 a 1 b 2 c...

pandas學習筆記

1 建立物件,瀏覽資料 建立物件,瀏覽資料 import pandas as pd import numpy as np import matplotlib.pyplot as plt 建立series s pd.series 1,2,4,6,np.nan,9,10 index list abcde...

pandas學習筆記

1.series 類似numpy中的一維陣列,表示為索引 從0開始 和值。建立 import pandas as pd,numpy as np s1 pd.series np.arange 10 s2 pd.series 12 2,5 s3 pd.series 含有的屬性 s1.values s1....