知識總結
問題參考
缺失資料處理:在資料處理過程中,缺失資料(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....