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

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

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

前言

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

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

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

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

在這里插入圖片描述

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

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

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

df.isna()

在這里插入圖片描述

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

接下來讓我們驗證這兩種方法的等效性:

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

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

在這里插入圖片描述

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

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

證明這四個方法確實是兩兩相同,兩兩相反。

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

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

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

在這里插入圖片描述

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

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

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

在這里插入圖片描述

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

2)配合索引使用

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

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

在這里插入圖片描述

3)配合邏輯方法使用

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

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

在這里插入圖片描述

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

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

在這里插入圖片描述

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

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

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

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

2.缺失值的刪除

在pandas中利用dropna方法對缺失值進行刪除:

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索引進行訪問等同。

在這里插入圖片描述

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

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

可以看到確實是成功刪除了。

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代表 沿著列 進行求和,最終返回的是 每行 的和,而dropna中axis參數(shù)為1僅代表對 每列 的非缺失值進行thresh值比較,意義是不同的,這也警告我們不要對所有方法中的axis參數(shù)統(tǒng)一去看待,要視情況而定。

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

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

#刪除身高體重均為缺失值的行(保留身高體重至少有一個為非缺失值的行)
>>> 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

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

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

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

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

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

在這里插入圖片描述

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

二、缺失值的填充和插值

1.填充

我們利用fillna方法對缺失值進行填充,以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ù)進行填充

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

#使用字典進行填充
>>> 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

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

2)利用method方法進行填充

也可以利用method方法進行連續(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

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

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

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

>>> 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ù)進行使用,這里不再贅述。

練一練

題目:對一個序列以如下規(guī)則填充缺失值:如果單獨出現(xiàn)的缺失值,就用前后均值填充,如果連續(xù)出現(xiàn)的缺失值就不填充,即序列[1, NaN, 3, NaN, NaN]填充后為[1, 2, 3, NaN, NaN],請利用fillna函數(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

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

2.插值方法

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

  • limit_direction:‘forward'代表由前面的非缺失值進行插值,‘backward'代表由前面的非缺失值進行插值,‘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

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

2)最鄰近插值

注意要提前install scipy庫,否則會報錯:

在這里插入圖片描述

在這里插入圖片描述

>>> 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

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

3)索引插值

索引插值可以理解成不等比線性插值,它是根據(jù)索引的相對距離進行插入,有點百分位數(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表示缺失值,它倆的共同點都是與其他值不等,而不同點是后者與自己也不等且沒有用于關(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

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

np.nan的缺陷在于,它的本質(zhì)是一種float類型的變量,當(dāng)它和其他類型同時存在于數(shù)據(jù)中時,會改變整個數(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ù)據(jù)序列變成float64型;當(dāng)np.nan和其他類型變量放在一起時,會使整個數(shù)據(jù)序列變成object型。

2.pandas中的Nullable類型

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

它們的作用之一是在比較時返回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

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

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

對np.nan和pd.NA進行標(biāo)量運算時,除了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

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

>>> 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)性檢驗

在數(shù)據(jù)處理中,含有過多缺失值的列往往會被刪除,除非缺失情況與標(biāo)簽強相關(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")
#分別進行行列匯總 方便計算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

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

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

KNN是一種監(jiān)督式學(xué)習(xí)模型,既可以解決回歸問題,又可以解決分類問題。對于分類變量,利用KNN分類模型可以實現(xiàn)其缺失值的插補,思路是度量缺失樣本的特征與所有其他樣本特征的距離,當(dāng)給定了模型參數(shù)n_neighbors=n時,計算離該樣本距離最近的n個樣本點中最多的那個類別,并把這個類別作為該樣本的缺失預(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.缺失值插補

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

在這里插入圖片描述

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

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

相關(guān)文章

  • cookies應(yīng)對python反爬蟲知識點詳解

    cookies應(yīng)對python反爬蟲知識點詳解

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

    Python進行圖片信息提取并重命名

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

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

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

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

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

    利用python繪制帶有時間線的柱狀圖

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

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

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

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

    Matplotlib 是 Python 的二維繪圖庫,用于生成符合出版質(zhì)量或跨平臺交互環(huán)境的各類圖形。今天通過本文給大家分享Python 數(shù)據(jù)科學(xué) Matplotlib的相關(guān)知識,感興趣的朋友一起看看吧
    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的輕量級ORM框架peewee使用教程

    Python的輕量級ORM框架peewee使用教程

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

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

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

最新評論

柳州市| 青川县| 比如县| 九江县| 得荣县| 桂东县| 镇康县| 临高县| 瑞昌市| 晴隆县| 宜阳县| 屏东市| 顺义区| 定结县| 莎车县| 茶陵县| 美姑县| 昭苏县| 温宿县| 堆龙德庆县| 保德县| 屯留县| 民权县| 科尔| 株洲市| 靖宇县| 吴堡县| 资中县| 会泽县| 察隅县| 绥芬河市| 西乡县| 大田县| 兰州市| 平阳县| 道孚县| 珲春市| 洛阳市| 洪泽县| 怀化市| 揭东县|