最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pandas之缺失數(shù)據(jù)的實(shí)現(xiàn)

 更新時(shí)間:2021年01月06日 09:31:32   作者:黃元帥  
這篇文章主要介紹了Pandas之缺失數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

本章介紹pandas中的缺失數(shù)據(jù),主要內(nèi)容有:

  • pandas中對(duì)np.nan的操作: 統(tǒng)計(jì) 、 刪除 、 填充 、 插值
  •  pandas中的Nullable類型及相關(guān)操作

在無特殊說明時(shí),本章主要采用的df數(shù)據(jù)如下,不再重復(fù)說明:

df = pd.read_csv('./data/learn_pandas.csv',usecols=['Grade','Name','Gender','Height','Weight','Transfer'])
df

在這里插入圖片描述

一、缺失值的統(tǒng)計(jì)和刪除

1.缺失值的統(tǒng)計(jì)

我們可以使用isna()和isnull()方法來統(tǒng)計(jì)數(shù)據(jù)中的np.nan數(shù)據(jù):

df.isna()

在這里插入圖片描述

返回的是相同形狀的數(shù)據(jù),對(duì)于非np.nan的元素返回 Fasle ,否則返回 True

接下來讓我們驗(yàn)證這兩種方法的等效性:

>>> df.isna().equals(df.isnull())
True

notna()和notnull()方法與isna()方法正好相反,它對(duì)非缺失值返回的是True,缺失值返回Fasle:

在這里插入圖片描述

同樣地,我們來驗(yàn)證一下它們之間的關(guān)系:

>>> df.notna().equals(df.notnull())
True
>>> df.notna().equals(~df.isna())
True

證明這四個(gè)方法確實(shí)是兩兩相同,兩兩相反。

1)配合其他統(tǒng)計(jì)方法使用

我們可以將isna()方法與一些其他統(tǒng)計(jì)方法一起使用,如統(tǒng)計(jì)每行數(shù)據(jù)缺失值的數(shù)量:

df.isna().sum(axis = 1)

在這里插入圖片描述

axis = 1代表沿著每列去統(tǒng)計(jì),結(jié)果返回的是每行的缺失值數(shù)

也可以統(tǒng)計(jì)每列缺失值所占的比例:

df.isna().sum(axis = 0)/df.shape[0]

在這里插入圖片描述

其中,axis = 0代表代表沿著每行去統(tǒng)計(jì),結(jié)果返回的是每列的缺失值數(shù),df.shape[0]代表數(shù)據(jù)列的長度。

2)配合索引使用

也可以將isna()方法與索引一起使用,如返回體重為缺失值的行:

df[df['Weight'].isna()]

在這里插入圖片描述

3)配合邏輯方法使用

如果要返回身高體重同時(shí)缺失的行,就需要邏輯方法配合:

df[df[['Height','Weight']].isna().all(axis = 1)]

在這里插入圖片描述

也可以統(tǒng)計(jì)df中有缺失值的列:

df.isna().any(axis = 0)

在這里插入圖片描述

返回False代表該列無缺失值,True代表該列至少有一個(gè)缺失值。

總結(jié)規(guī)律如下:

缺失值方法 邏輯方法 結(jié)果 含義
isna() or isnull() all True 都是缺失值 情況4
isna() or isnull() all False 不都是缺失值 情況3
isna() or isnull() any True 至少有一個(gè)缺失值 情況2
isna() or isnull() any False 都不是缺失值 情況1
notna() or notnull() all True 都是非缺失值 情況1
notna() or notnull() all False 不都是非缺失值 情況2
notna() or notnull() any True 至少有一個(gè)非缺失值 情況3
notna() or notnull() any False 都不是非缺失值 情況4

進(jìn)一步總結(jié),上面的含義可以劃分為4種情況,即isna()和notna()在邏輯方法不同,結(jié)果不同時(shí),代表含義相同。

2.缺失值的刪除

在pandas中利用dropna方法對(duì)缺失值進(jìn)行刪除:

res = df.dropna(how = 'all',subset=['Height','Weight'])
res

how參數(shù)可以設(shè)置成‘a(chǎn)ll'或‘a(chǎn)ny',默認(rèn)是‘a(chǎn)ny',subset參數(shù)代表刪除考慮的列名,作用和利用df索引進(jìn)行訪問等同。

在這里插入圖片描述

來跟上面例子聯(lián)動(dòng)一下,查看一下行索引為91和102的同學(xué):

>>> res.loc[91]
KeyError: 91
>>> res.loc[102]
KeyError: 102

可以看到確實(shí)是成功刪除了。

1)thresh參數(shù)

thresh參數(shù)代表數(shù)據(jù)不被刪除至少需要的非缺失值數(shù)量:

df.dropna(axis = 1,thresh = df.shape[0] - 15)

在這里插入圖片描述

這里的axis參數(shù)跟上面sum方法中的axis參數(shù)相比,有一些不一樣。我們知道sum方法中axis參數(shù)為1代表 沿著列 進(jìn)行求和,最終返回的是 每行 的和,而dropna中axis參數(shù)為1僅代表對(duì) 每列 的非缺失值進(jìn)行thresh值比較,意義是不同的,這也警告我們不要對(duì)所有方法中的axis參數(shù)統(tǒng)一去看待,要視情況而定。

2)自定義方法代替dropna方法

其實(shí)dropna的返回結(jié)果可以理解成按條件篩選,所以我們可以利用缺失值統(tǒng)計(jì)的相關(guān)方法進(jìn)行自定義方法來代替方法:

#刪除身高體重均為缺失值的行(保留身高體重至少有一個(gè)為非缺失值的行)
>>> res2 = df[df[['Height','Weight']].notna().any(axis = 1)]
>>> res2.equals(res)
True
>>> res = df.dropna(how = 'any',subset=['Height','Weight'])
>>> res2 = df[df[['Height','Weight']].notna().all(axis = 1)]
>>> res2.equals(res)
True

對(duì)于無thresh參數(shù)的簡單dropna使用,總結(jié)如下:

dropna的how參數(shù) 對(duì)應(yīng)的缺失值統(tǒng)計(jì)方法和邏輯方法
all notna + any
any notna + all

這是由于,dropna()代表刪除isna()在all判斷下為True的數(shù)據(jù),等價(jià)于保留notna()在any判斷下為True的數(shù)據(jù)。

在來看如何代替帶有thresh參數(shù)的dropna方法:

df.loc[:,df.notna().sum(axis = 0) >= df.shape[0]-15]

在這里插入圖片描述

即利用notna方法和loc索引,返回非缺失值大于等于thresh的列。

二、缺失值的填充和插值

1.填充

我們利用fillna方法對(duì)缺失值進(jìn)行填充,以Series舉例,比較重要的參數(shù)有:

  • value:標(biāo)量或字典(索引到元素的映射)
  • method:ffill代表由前面的非缺失值來填充,bfill代表由后面的來填充,默認(rèn)是None
  • limit:代表連續(xù)缺失值最多填充次數(shù)
  • inplace:是否替換原數(shù)據(jù)

在這里使用的Series數(shù)據(jù)如下:

>>> s = pd.Series([np.nan,2,np.nan,np.nan,0,np.nan],list('Xiaomy'))
>>> s
X  NaN
i  2.0
a  NaN
o  NaN
m  0.0
y  NaN
dtype: float64

1)利用value參數(shù)進(jìn)行填充

#使用標(biāo)量進(jìn)行填充
>>> s.fillna(1)
X  1.0
i  2.0
a  1.0
o  1.0
m  0.0
y  1.0
dtype: float64

#使用字典進(jìn)行填充
>>> s.fillna({'X':1,'y':100,'c':1})
X   1.0
i   2.0
a   NaN
o   NaN
m   0.0
y  100.0
dtype: float64

我們可以看到在使用字典進(jìn)行填充時(shí)字典不需要包含所有缺失值的索引,且字典里面可以包含其他非索引值。

2)利用method方法進(jìn)行填充

也可以利用method方法進(jìn)行連續(xù)填充:

#由前面的非缺失值向后填充
>>> s.fillna(method='ffill')
X  NaN
i  2.0
a  2.0
o  2.0
m  0.0
y  0.0
dtype: float64

#由后面的非缺失值向前填充
>>> s.fillna(method='bfill')
X  2.0
i  2.0
a  0.0
o  0.0
m  0.0
y  NaN
dtype: float64

這里可以看到,對(duì)于ffill方式,開始的缺失值是不能填充的;對(duì)于bfill方式,結(jié)尾的缺失值也是不能填充的。

3)分組和缺失值填充的配合

對(duì)于df數(shù)據(jù)中身高的缺失項(xiàng),最好利用對(duì)應(yīng)年級(jí)的相同性別的平均身高來填充:

>>> df.groupby(['Grade','Gender'])['Height'].transform(lambda x:x.fillna(x.mean()))
0   158.900000
1   166.500000
2   188.900000
3   158.363158
4   174.000000
     ...  
195  153.900000
196  160.900000
197  153.900000
198  175.300000
199  155.700000
Name: Height, Length: 200, dtype: float64

這里利用的是分組中的自定義變換方法配合缺失值填充使用。

另外,limit參數(shù)可以限制填充的次數(shù),以配合method參數(shù)為例:

>>> s.fillna(method='ffill',limit=1)
X  NaN
i  2.0
a  2.0
o  NaN
m  0.0
y  0.0
dtype: float64

當(dāng)然,limit參數(shù)也可以配合其他參數(shù)進(jìn)行使用,這里不再贅述。

練一練

題目:對(duì)一個(gè)序列以如下規(guī)則填充缺失值:如果單獨(dú)出現(xiàn)的缺失值,就用前后均值填充,如果連續(xù)出現(xiàn)的缺失值就不填充,即序列[1, NaN, 3, NaN, NaN]填充后為[1, 2, 3, NaN, NaN],請(qǐng)利用fillna函數(shù)實(shí)現(xiàn)。(提示:利用`limit``參數(shù))

>>> s = pd.Series([1,np.nan,3,np.nan,np.nan])
>>> res = (s.fillna(method='ffill',limit=1)+s.fillna(method='bfill',limit=1))/2
>>> res
0  1.0
1  2.0
2  3.0
3  NaN
4  NaN
dtype: float64

思路:對(duì)于不滿足題設(shè)條件的位置包括處于兩端的位置,利用np.nan和其他值相加為本身的特性,依然保持為np.nan;對(duì)于左右均為非缺失值的位置,即可求得左右兩側(cè)之和,然后最后除2即可。

2.插值方法

在pandas中一般使用interpolate方法進(jìn)行插值,重要的參數(shù)有:

  • limit_direction:‘forward'代表由前面的非缺失值進(jìn)行插值,‘backward'代表由前面的非缺失值進(jìn)行插值,‘both'代表二者兼有
  • method:插值方法,包括‘nearest', ‘zero', ‘slinear', ‘quadratic', ‘cubic', ‘spline', ‘barycentric', ‘polynomial',默認(rèn)為‘linear'
  • inplace:是否替換原數(shù)據(jù)
  • limit:插值次數(shù)

本節(jié)使用的Series數(shù)據(jù)如下:

>>> s = pd.Series([np.nan, np.nan, 1, np.nan, np.nan, np.nan, 2, np.nan, np.nan])
>>> s
0  NaN
1  NaN
2  1.0
3  NaN
4  NaN
5  NaN
6  2.0
7  NaN
8  NaN
dtype: float64

1)線性插值

>>> s.interpolate(limit_direction='backward')
0  1.00
1  1.00
2  1.00
3  1.25
4  1.50
5  1.75
6  2.00
7   NaN
8   NaN
dtype: float64

>>> s.interpolate(limit_direction='both')
0  1.00
1  1.00
2  1.00
3  1.25
4  1.50
5  1.75
6  2.00
7  2.00
8  2.00
dtype: float64

這里舉了向前和向兩端分別進(jìn)行線性插值的例子,這里注意如果缺失值的左側(cè)或右側(cè)完全沒有非缺失值,那么它會(huì)由最近的非缺失值來填充。

2)最鄰近插值

注意要提前install scipy庫,否則會(huì)報(bào)錯(cuò):

在這里插入圖片描述

在這里插入圖片描述

>>> s.interpolate(method = 'nearest')
0  NaN
1  NaN
2  1.0
3  1.0
4  1.0
5  2.0
6  2.0
7  NaN
8  NaN
dtype: float64

注意,這里會(huì)忽視兩端,且距離兩側(cè)非缺失值相同的位置會(huì)默認(rèn)插入前一個(gè)非缺失值。

3)索引插值

索引插值可以理解成不等比線性插值,它是根據(jù)索引的相對(duì)距離進(jìn)行插入,有點(diǎn)百分位數(shù)的意思:

>>> s = pd.Series([0,np.nan,100],index=[0,1,10])
>>> s.interpolate(method = 'index')
0    0.0
1   10.0
10  100.0
dtype: float64

>>> s.interpolate()
0    0.0
1   50.0
10  100.0
dtype: float64

注意它和線性插值的區(qū)別。

三、Nullable類型

1.缺失值的本質(zhì)和缺陷

python中用None表示缺失值,Numpy中用np.nan表示缺失值,它倆的共同點(diǎn)都是與其他值不等,而不同點(diǎn)是后者與自己也不等且沒有用于關(guān)鍵字,需要通過numpy.nan來使用:

>>> None == True
False
>>> np.nan == True
False
>>> np.nan == []
False
>>> None == []
False
>>> np.nan == ''
False
>>> None == ''
False
>>> None == None
True
>>> np.nan == np.nan
False
>>> pd.Series([1, np.nan]) == pd.Series([1, np.nan])
True

雖然兩個(gè)np.nan是不等的,但是對(duì)于包含np.nan變量的s或df數(shù)據(jù),它們會(huì)跳過比較對(duì)應(yīng)位置的np.nan變量。

np.nan的缺陷在于,它的本質(zhì)是一種float類型的變量,當(dāng)它和其他類型同時(shí)存在于數(shù)據(jù)中時(shí),會(huì)改變整個(gè)數(shù)據(jù)的類型,如:

>>> pd.Series([100,np.nan]).dtype
dtype('float64')
>>> pd.Series(['1',np.nan]).dtype
dtype('O')
>>> pd.Series([False,np.nan]).dtype
dtype('O')

當(dāng)np.nan和int型變量放在一起時(shí),會(huì)使整個(gè)數(shù)據(jù)序列變成float64型;當(dāng)np.nan和其他類型變量放在一起時(shí),會(huì)使整個(gè)數(shù)據(jù)序列變成object型。

2.pandas中的Nullable類型

pandas設(shè)計(jì)了新的缺失類型pd.NA以及三種Nullable序列類型嘗試解決這些缺陷

它們的作用之一是在比較時(shí)返回pd.NA本身而不是False:

>>> s = pd.Series(['a', 'b'])
>>> s_bool = pd.Series([True, np.nan])
>>> s_boolean = pd.Series([True, np.nan]).astype('boolean')
>>> s_bool & True
0   True
1  False
dtype: bool
>>> s_boolean & True
0  True
1  <NA>
dtype: boolean

即不會(huì)改變比較前后的結(jié)果。

3.缺失數(shù)據(jù)的計(jì)算和分組

對(duì)np.nan和pd.NA進(jìn)行標(biāo)量運(yùn)算時(shí),除了1的np.nan次冪和np.nan的0次冪兩種情況以外,均返回其自身:

>>> np.nan + 1
nan
>>> pd.NA + 1
<NA>
>>> np.nan * 10
nan
>>> pd.NA * 10
<NA>
>>> np.nan ** 0
1.0
>>> 1 ** np.nan
1.0

在對(duì)含有np.nan的數(shù)據(jù)進(jìn)行操作時(shí),默認(rèn)會(huì)忽略它們,如:

>>> s = pd.Series([7,6,np.nan,5,4])
>>> s.sum()
22.0

注意雖然忽視了np.nan,但由于np.nan的存在,還是讓結(jié)果變?yōu)榱薴loat類型。

練習(xí)

Ex1:缺失值與類別的相關(guān)性檢驗(yàn)

在數(shù)據(jù)處理中,含有過多缺失值的列往往會(huì)被刪除,除非缺失情況與標(biāo)簽強(qiáng)相關(guān)。下面有一份關(guān)于二分類問題的數(shù)據(jù)集,其中X_1, X_2為特征變量,y為二分類標(biāo)簽:

df = pd.read_csv('./data/missing_chi.csv')
df

在這里插入圖片描述

在這里插入圖片描述

from scipy.stats import chi2
df = pd.read_csv('./data/missing_chi.csv')
#分別將兩列的缺失值和非缺失值替換為字符‘NaN'和‘NotNaN'
cat_1 = df.X_1.fillna('NaN').mask(df.X_1.notna()).fillna("NotNaN")
cat_2 = df.X_2.fillna('NaN').mask(df.X_2.notna()).fillna("NotNaN")
#分別進(jìn)行行列匯總 方便計(jì)算Eij和Fij
df_1 = pd.crosstab(cat_1, df.y, margins=True)
df_2 = pd.crosstab(cat_2, df.y, margins=True)
def compute_S(my_df):
	#雙層遍歷,利用列表推導(dǎo)生成式去做
  res = [((my_df.iat[i, j]-(my_df.iat[i, 2]*my_df.iat[2, j]/my_df.iat[2,2]))**2/(my_df.iat[i, 2]*my_df.iat[2, j]/my_df.iat[2,2])) for i in range(2) for j in range(2)]
  #返回總和
  return sum(res)
res1 = compute_S(df_1)
res2 = compute_S(df_2)
>>> print(chi2.sf(res1, 1) < 0.05)
False
>>> print(chi2.sf(res2, 1) < 0.05)
True

思路:照著參考答案寫的,對(duì)每一步進(jìn)行注釋,并對(duì)循環(huán)進(jìn)行了一定的優(yōu)化。

Ex2:用回歸模型解決分類問題

KNN是一種監(jiān)督式學(xué)習(xí)模型,既可以解決回歸問題,又可以解決分類問題。對(duì)于分類變量,利用KNN分類模型可以實(shí)現(xiàn)其缺失值的插補(bǔ),思路是度量缺失樣本的特征與所有其他樣本特征的距離,當(dāng)給定了模型參數(shù)n_neighbors=n時(shí),計(jì)算離該樣本距離最近的n個(gè)樣本點(diǎn)中最多的那個(gè)類別,并把這個(gè)類別作為該樣本的缺失預(yù)測類別,具體如下圖所示,未知的類別被預(yù)測為黃色:

在這里插入圖片描述

df = pd.read_excel('./data/color.xlsx')
df.head()

在這里插入圖片描述

from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=6)
#傳入前兩列和預(yù)測值
clf.fit(df.iloc[:,:2], df.Color)
clf.predict([[0.8, -0.2]])

1.分類轉(zhuǎn)回歸 2.缺失值插補(bǔ)

df = pd.read_csv('./data/audit.csv')
df.head()

在這里插入圖片描述

參考文獻(xiàn)1.pandas中Dataframe的查詢方法([], loc, iloc, at, iat, ix)

到此這篇關(guān)于Pandas之缺失數(shù)據(jù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Pandas之缺失數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • cookies應(yīng)對(duì)python反爬蟲知識(shí)點(diǎn)詳解

    cookies應(yīng)對(duì)python反爬蟲知識(shí)點(diǎn)詳解

    在本篇文章里小編給大家整理關(guān)于cookies應(yīng)對(duì)python反爬蟲知識(shí)點(diǎn)詳解,有興趣的朋友們可以學(xué)習(xí)下。
    2020-11-11
  • Python進(jìn)行圖片信息提取并重命名

    Python進(jìn)行圖片信息提取并重命名

    Tesseract-OCR是一款優(yōu)秀的開源OCR軟件,本文主要介紹了如何使用Tesseract-OCR工具識(shí)別圖片并提取信息,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • Python?輕松實(shí)現(xiàn)可視化大屏

    Python?輕松實(shí)現(xiàn)可視化大屏

    對(duì)于從事數(shù)據(jù)領(lǐng)域的小伙伴來說,當(dāng)需要闡述自己觀點(diǎn)、展示項(xiàng)目成果時(shí),我們需要在最短時(shí)間內(nèi)讓別人知道你的想法。我相信單調(diào)乏味的語言很難讓別人快速理解。最直接有效的方式就是將數(shù)據(jù)進(jìn)行可視化展現(xiàn)
    2022-01-01
  • python-opencv 中值濾波{cv2.medianBlur(src, ksize)}的用法

    python-opencv 中值濾波{cv2.medianBlur(src, ksize)}的用法

    這篇文章主要介紹了python-opencv 中值濾波{cv2.medianBlur(src, ksize)}的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2021-06-06
  • 利用python繪制帶有時(shí)間線的柱狀圖

    利用python繪制帶有時(shí)間線的柱狀圖

    這篇文章主要為大家詳細(xì)介紹了如何使用python繪制出帶有時(shí)間線的柱狀圖,文中的示例代碼講解的非常詳細(xì),具有一定的學(xué)習(xí)與借鑒價(jià)值,需要的可以參考一下
    2023-07-07
  • 用python將pdf轉(zhuǎn)化為有聲讀物

    用python將pdf轉(zhuǎn)化為有聲讀物

    大家好,本篇文章主要講的用python將pdf轉(zhuǎn)化為有聲讀物,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Python 數(shù)據(jù)科學(xué) Matplotlib圖庫詳解

    Python 數(shù)據(jù)科學(xué) Matplotlib圖庫詳解

    Matplotlib 是 Python 的二維繪圖庫,用于生成符合出版質(zhì)量或跨平臺(tái)交互環(huán)境的各類圖形。今天通過本文給大家分享Python 數(shù)據(jù)科學(xué) Matplotlib的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-07-07
  • Python?cv.Canny()方法參數(shù)與使用方法

    Python?cv.Canny()方法參數(shù)與使用方法

    這篇文章主要介紹了Python?cv.Canny()方法參數(shù)與使用方法,OpenCV提供了cv.Canny()方法,該方法將輸入的原始圖像轉(zhuǎn)換為邊緣圖像,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • Python的輕量級(jí)ORM框架peewee使用教程

    Python的輕量級(jí)ORM框架peewee使用教程

    這篇文章主要介紹了Python的輕量級(jí)ORM框架peewee使用教程,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-02-02
  • tkinter禁用(只讀)下拉列表Combobox問題

    tkinter禁用(只讀)下拉列表Combobox問題

    這篇文章主要介紹了tkinter禁用(只讀)下拉列表Combobox問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論

盖州市| 儋州市| 蒲江县| 勐海县| 阿克苏市| 奉节县| 博湖县| 常山县| 横山县| 旺苍县| 邯郸市| 宣武区| 泸定县| 苏尼特左旗| 普陀区| 吐鲁番市| 鄱阳县| 呼伦贝尔市| 冷水江市| 江门市| 安塞县| 迁西县| 崇信县| 南岸区| 萨嘎县| 日土县| 永丰县| 自治县| 洛宁县| 苏尼特右旗| 平顶山市| 旺苍县| 富川| 绥阳县| 阿拉善左旗| 砀山县| 崇州市| 呼玛县| 五河县| 石楼县| 嘉义县|