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

Pandas處理缺失數(shù)據(jù)的方式匯總

 更新時間:2025年09月24日 10:47:12   作者:Humbunklung  
許多教程中的數(shù)據(jù)與現(xiàn)實世界中的數(shù)據(jù)有很大不同,現(xiàn)實世界中的數(shù)據(jù)很少是干凈且同質(zhì)的,本文我們將討論處理缺失數(shù)據(jù)的一些常規(guī)注意事項,了解 Pandas 如何表示缺失數(shù)據(jù),并探索 Pandas 在 Python 中處理缺失數(shù)據(jù)的一些內(nèi)置工具,需要的朋友可以參考下

許多教程中的數(shù)據(jù)與現(xiàn)實世界中的數(shù)據(jù)有很大不同,現(xiàn)實世界中的數(shù)據(jù)很少是干凈且同質(zhì)的。

尤其是,許多有趣的數(shù)據(jù)集都會存在一定程度的數(shù)據(jù)缺失。

更復(fù)雜的是,不同的數(shù)據(jù)來源可能會用不同的方式表示缺失數(shù)據(jù)。

我們將討論處理缺失數(shù)據(jù)的一些常規(guī)注意事項,了解 Pandas 如何表示缺失數(shù)據(jù),并探索 Pandas 在 Python 中處理缺失數(shù)據(jù)的一些內(nèi)置工具。

在本書中及整個過程中,我會將缺失數(shù)據(jù)統(tǒng)稱為 null、NaN 或 NA 值。

缺失數(shù)據(jù)約定的權(quán)衡

為了在表格或 DataFrame 中跟蹤缺失數(shù)據(jù)的存在,已經(jīng)開發(fā)了多種方法。通常,這些方法圍繞兩種策略展開:使用全局指示缺失值的 掩碼,或選擇一個表示缺失項的 哨兵值。

在掩碼方法中,掩碼可以是一個完全獨(dú)立的布爾數(shù)組,也可以通過占用數(shù)據(jù)表示中的某一位來局部指示值的缺失狀態(tài)。

在哨兵值方法中,哨兵值可以是某種特定于數(shù)據(jù)的約定,比如用 –9999 或某個罕見的位模式表示缺失的整數(shù)值,或者采用更通用的約定,比如用 NaN(非數(shù)字 Not a Number)表示缺失的浮點(diǎn)值,這是 IEEE 浮點(diǎn)規(guī)范中的特殊值。

這兩種方法都存在權(quán)衡。使用單獨(dú)的掩碼數(shù)組需要分配額外的布爾數(shù)組,這會增加存儲和計算的開銷。哨兵值則減少了可表示的有效值范圍,并且可能需要額外(通常是非優(yōu)化的)CPU 和 GPU 算術(shù)邏輯,因為像 NaN 這樣的常用特殊值并不適用于所有數(shù)據(jù)類型。

正如大多數(shù)沒有普遍最優(yōu)選擇的情況一樣,不同的語言和系統(tǒng)采用了不同的約定。例如,R 語言在每種數(shù)據(jù)類型中使用保留的位模式作為指示缺失數(shù)據(jù)的哨兵值,而 SciDB 系統(tǒng)則為每個單元格附加一個額外的字節(jié)來指示 NA 狀態(tài)。

Pandas 中的缺失數(shù)據(jù)

Pandas 處理缺失值的方式受到其對 NumPy 包的依賴的限制,而 NumPy 對于非浮點(diǎn)數(shù)據(jù)類型并沒有內(nèi)置的 NA(缺失值)概念。

或許 Pandas 可以像 R 一樣,為每種數(shù)據(jù)類型指定位模式來表示空值,但這種方法實際上非常繁瑣。R 只有 4 種主要數(shù)據(jù)類型,而 NumPy 支持的類型遠(yuǎn)遠(yuǎn)多于此:例如,R 只有一種整數(shù)類型,而 NumPy 在考慮不同的位寬、符號和字節(jié)序后,基本整數(shù)類型就有 14 種。如果要在所有可用的 NumPy 類型中保留特定的位模式,將導(dǎo)致在各種類型的操作中需要大量特殊處理,甚至可能需要為 NumPy 包開發(fā)新的分支。此外,對于較小的數(shù)據(jù)類型(如 8 位整數(shù)),犧牲一位作為掩碼會顯著減少其可表示的數(shù)值范圍。

由于這些限制和權(quán)衡,Pandas 在存儲和處理空值時有兩種“模式”:

  • 默認(rèn)模式是使用哨兵值(sentinel)來表示缺失數(shù)據(jù),根據(jù)數(shù)據(jù)類型使用 NaNNone 作為哨兵值。
  • 另外,你可以選擇使用 Pandas 提供的可空數(shù)據(jù)類型(nullable dtypes,后文會詳細(xì)介紹),這會創(chuàng)建一個額外的掩碼數(shù)組來跟蹤缺失項,并將這些缺失項以特殊的 pd.NA 值呈現(xiàn)給用戶。

無論采用哪種方式,Pandas API 提供的數(shù)據(jù)操作和處理方法都會以可預(yù)測的方式處理和傳播這些缺失項。但為了更好地理解這些選擇背后的原因,我們需要快速了解一下 None、NaNNA 的權(quán)衡。像往常一樣,我們先導(dǎo)入 NumPy 和 Pandas:

import numpy as np
import pandas as pd

None 作為哨兵值

對于某些數(shù)據(jù)類型,Pandas 使用 None 作為哨兵值。None 是一個 Python 對象,這意味著任何包含 None 的數(shù)組都必須具有 dtype=object,即它必須是一個 Python 對象的序列。

例如,觀察如果你將 None 傳遞給 NumPy 數(shù)組會發(fā)生什么:

vals1 = np.array([1, None, 2, 3])
vals1
array([1, None, 2, 3], dtype=object)

這種 dtype=object 表示 NumPy 能為數(shù)組內(nèi)容推斷出的最佳通用類型是 Python 對象。
以這種方式使用 None 的缺點(diǎn)是,對數(shù)據(jù)的操作會在 Python 層面進(jìn)行,開銷遠(yuǎn)大于對原生類型數(shù)組的高效操作:

%timeit np.arange(1E6, dtype=int).sum()
2.89 ms ± 24.6 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.arange(1E6, dtype=object).sum()
26.7 ms ± 454 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)

進(jìn)一步,由于 Python 不支持使用 None 進(jìn)行算術(shù)運(yùn)算,因此諸如 summin 之類的聚合操作通常會導(dǎo)致錯誤:

vals1.sum()
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

Cell In[5], line 1
----> 1 vals1.sum()


File d:\Source\Repos\Visual Studio Code\MachineLearning-notes\.venv\Lib\site-packages\numpy\_core\_methods.py:53, in _sum(a, axis, dtype, out, keepdims, initial, where)
     51 def _sum(a, axis=None, dtype=None, out=None, keepdims=False,
     52          initial=_NoValue, where=True):
---> 53     return umr_sum(a, axis, dtype, out, keepdims, initial, where)


TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

鑒于此,Pandas 不會在其數(shù)值數(shù)組中使用 None 作為哨兵值。

NaN:缺失的數(shù)值數(shù)據(jù)

另一種缺失數(shù)據(jù)的哨兵值是 NaN,它有所不同;NaN 是一種特殊的浮點(diǎn)值,被所有采用標(biāo)準(zhǔn) IEEE 浮點(diǎn)表示法的系統(tǒng)所識別:

vals2 = np.array([1, np.nan, 3, 4]) 
vals2
array([ 1., nan,  3.,  4.])

請注意,NumPy 為該數(shù)組選擇了本地浮點(diǎn)類型:這意味著與之前的 object 數(shù)組不同,這個數(shù)組支持被編譯代碼加速的快速操作。
需要記住的是,NaN 有點(diǎn)像數(shù)據(jù)病毒——它會“感染”它接觸到的任何其他對象。
無論進(jìn)行何種運(yùn)算,與 NaN 進(jìn)行算術(shù)運(yùn)算的結(jié)果仍然是另一個 NaN

1 + np.nan
nan
0 * np.nan
nan

這意味著對這些值進(jìn)行聚合操作是有定義的(即不會導(dǎo)致錯誤),但結(jié)果并不總是有用:

vals2.sum(), vals2.min(), vals2.max()
(np.float64(nan), np.float64(nan), np.float64(nan))

也就是說,NumPy 提供了能夠識別 NaN 并忽略這些缺失值的聚合函數(shù)版本:

np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)
(np.float64(8.0), np.float64(1.0), np.float64(4.0))

NaN 的主要缺點(diǎn)在于它僅適用于浮點(diǎn)類型;對于整數(shù)、字符串或其他類型,并沒有等價的 NaN 值。

Pandas 中的 NaN 和 None

NaNNone 各有其用途,Pandas 能夠幾乎無縫地處理這兩者,并在適當(dāng)?shù)臅r候自動進(jìn)行轉(zhuǎn)換:

pd.Series([1, np.nan, 2, None])
0    1.0
1    NaN
2    2.0
3    NaN
dtype: float64

對于沒有可用哨兵值的數(shù)據(jù)類型,當(dāng)存在 NA 值時,Pandas 會自動進(jìn)行類型轉(zhuǎn)換。
例如,如果我們在一個整數(shù)數(shù)組中設(shè)置某個值為 np.nan,它會自動被提升為浮點(diǎn)類型以容納 NA:

x = pd.Series(range(2), dtype=int)
x
0    0
1    1
dtype: int64
x[0] = None
x
0    NaN
1    1.0
dtype: float64

請注意,除了將整數(shù)數(shù)組轉(zhuǎn)換為浮點(diǎn)型之外,Pandas 還會自動將 None 轉(zhuǎn)換為 NaN 值。

雖然與 R 這類領(lǐng)域?qū)S谜Z言中對 NA 值更統(tǒng)一的處理方式相比,這種哨兵值/類型轉(zhuǎn)換的“魔法”看起來有些取巧,但實際上 Pandas 的這種做法在實踐中效果很好,而且據(jù)我的經(jīng)驗,只有極少數(shù)情況下會引發(fā)問題。

下表列出了在 Pandas 中引入 NA 值時的類型提升約定:

類型類別存儲 NA 時的轉(zhuǎn)換方式NA 哨兵值
floating無變化np.nan
object無變化None 或 np.nan
integer轉(zhuǎn)換為 float64np.nan
boolean轉(zhuǎn)換為 objectNone 或 np.nan

請記住,在 Pandas 中,字符串?dāng)?shù)據(jù)始終以 object 類型存儲。

Pandas 可空數(shù)據(jù)類型

在早期版本的 Pandas 中,NaNNone 作為哨兵值是唯一可用的缺失數(shù)據(jù)表示方法。這帶來的主要問題在于隱式類型轉(zhuǎn)換:例如,無法表示帶有缺失數(shù)據(jù)的真正整數(shù)數(shù)組。

為了解決這個問題,Pandas 后來引入了可空數(shù)據(jù)類型(nullable dtypes),它們與常規(guī)數(shù)據(jù)類型的區(qū)別在于名稱的大小寫(例如,pd.Int32np.int32)。為了向后兼容,只有在明確指定時才會使用這些可空數(shù)據(jù)類型。

例如,下面是一個包含缺失數(shù)據(jù)的整數(shù)序列 Series,它由一個包含三種可用缺失值標(biāo)記的列表創(chuàng)建:

pd.Series([1, np.nan, 2, None, pd.NA], dtype='Int32')
0       1
1    <NA>
2       2
3    <NA>
4    <NA>
dtype: Int32

這種表示方法在本文后續(xù)討論的所有操作中都可以與其他表示方法互換使用。

對缺失值的操作

如前所述,Pandas 將 None、NaNNA 視為本質(zhì)上可以互換的缺失值標(biāo)記。
為了方便這一約定,Pandas 提供了多種方法來檢測、移除和替換 Pandas 數(shù)據(jù)結(jié)構(gòu)中的缺失值。
這些方法包括:

  • isnull:生成一個布爾掩碼,用于指示缺失值
  • notnull:與 isnull 相反
  • dropna:返回過濾后的數(shù)據(jù)副本,移除缺失值
  • fillna:返回填充或插補(bǔ)缺失值后的數(shù)據(jù)副本

我們將簡要探索并演示這些常用方法的用法。

檢測空值

Pandas 數(shù)據(jù)結(jié)構(gòu)有兩個用于檢測空數(shù)據(jù)的有用方法:isnullnotnull。
這兩個方法都會返回數(shù)據(jù)上的布爾掩碼。例如:

data = pd.Series([1, np.nan, 'hello', None])
data.isnull()
0    False
1     True
2    False
3     True
dtype: bool

如數(shù)據(jù)索引和選擇中所述,布爾掩碼可以直接作為 SeriesDataFrame 的索引使用:

data[data.notnull()]
0        1
2    hello
dtype: object

isnull()notnull() 方法對于 DataFrame 對象也會產(chǎn)生類似的布爾結(jié)果。

刪除空值

除了這些掩碼方法外,還有一些便捷方法,如 dropna(用于移除 NA 值)和 fillna(用于填充 NA 值)。對于 Series,其結(jié)果很直接:

data.dropna()
0        1
2    hello
dtype: object

對于 DataFrame,有更多的選項。
請看下面的 DataFrame

df = pd.DataFrame([[1,      np.nan, 2],
                   [2,      3,      5],
                   [np.nan, 4,      6]])
df
012
01.0NaN2
12.03.05
2NaN4.06

我們無法從 DataFrame 中刪除單個值;只能刪除整行或整列。
根據(jù)具體應(yīng)用,你可能需要刪除行或列,因此 dropnaDataFrame 提供了多種選項。

默認(rèn)情況下,dropna 會刪除所有包含任意空值的行:

df.dropna()
012
12.03.05

或者,你也可以沿不同的軸刪除 NA 值。使用 axis=1axis='columns' 可以刪除所有包含空值的列:

df.dropna(axis='columns')
2
02
15
26

但這樣也會丟棄一些有用的數(shù)據(jù);你可能更希望只刪除那些全部為 NA 的行或列,或者 NA 占多數(shù)的行或列。
這可以通過 howthresh 參數(shù)來指定,從而精細(xì)控制允許通過的空值數(shù)量。

默認(rèn)情況下,how='any',即只要某行或某列包含空值就會被刪除。
你也可以指定 how='all',這樣只有那些全部為空值的行或列才會被刪除:

df[3] = np.nan
df
0123
01.0NaN2NaN
12.03.05NaN
2NaN4.06NaN
df.dropna(axis='columns', how='all')
012
01.0NaN2
12.03.05
2NaN4.06
df.dropna(axis='rows', thresh=3)
0123
12.03.05NaN

這里,第一行和最后一行被刪除了,因為它們每行只有兩個非空值。

填充空值

有時候,與其刪除 NA 值,你可能更希望用一個有效值來替換它們。
這個值可以是像零這樣的單個數(shù)字,也可以是通過已有有效值進(jìn)行插補(bǔ)或插值得到的某種值。
你可以使用 isnull 方法作為掩碼進(jìn)行原地替換,但由于這是一個非常常見的操作,Pandas 提供了 fillna 方法,它會返回一個用指定值替換空值后的數(shù)組副本。

來看下面的 Series 示例:

data = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'), dtype='Int32')
data
a       1
b    <NA>
c       2
d    <NA>
e       3
dtype: Int32

我們可以用單個值(例如零)來填充 NA 項:

data.fillna(0)
a    1
b    0
c    2
d    0
e    3
dtype: Int32

我們可以指定前向填充(forward fill),將前一個有效值向前傳播:

# 前向填充,舊方法,在后續(xù)Pandas版本中可能會被棄用
data.fillna(method='ffill')
\AppData\Local\Temp\ipykernel_13548\3988156040.py:2: FutureWarning: Series.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  data.fillna(method='ffill')





a    1
b    1
c    2
d    2
e    3
dtype: Int32
# 前向填充
data.ffill()
a    1
b    1
c    2
d    2
e    3
dtype: Int32

或者我們可以指定反向填充(backward fill),將下一個有效值向后傳播:

# 后向填充,舊方法,在后續(xù)Pandas版本中可能會被棄用
data.fillna(method='bfill')
\AppData\Local\Temp\ipykernel_13548\1439583404.py:2: FutureWarning: Series.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  data.fillna(method='bfill')





a    1
b    2
c    2
d    3
e    3
dtype: Int32
# 后向填充
data.bfill()
a    1
b    2
c    2
d    3
e    3
dtype: Int32

DataFrame 的情況下,選項類似,但我們還可以指定填充操作應(yīng)沿著哪個 axis(軸)進(jìn)行:

df
0123
01.0NaN2NaN
12.03.05NaN
2NaN4.06NaN
df.ffill(axis=1)
0123
01.01.02.02.0
12.03.05.05.0
2NaN4.06.06.0

請注意,如果在前向填充時沒有可用的前一個值,NA 值將保持不變。

總結(jié)

本文介紹了現(xiàn)實世界中缺失數(shù)據(jù)的常見情況及其在 Pandas 中的處理方式。我們討論了缺失值的兩種主要表示方法(掩碼和哨兵值),并重點(diǎn)介紹了 Pandas 對 None、NaNpd.NA 的支持及其背后的權(quán)衡。通過示例演示了缺失值的檢測(isnullnotnull)、刪除(dropna)和填充(fillna、ffill、bfill)等常用操作。此外,還介紹了 Pandas 的可空數(shù)據(jù)類型(如 Int32),使得帶缺失值的整數(shù)數(shù)據(jù)能夠被更好地支持。掌握這些方法有助于在數(shù)據(jù)分析過程中更高效、靈活地處理缺失數(shù)據(jù)問題。

以上就是Pandas處理缺失數(shù)據(jù)的方式匯總的詳細(xì)內(nèi)容,更多關(guān)于Pandas處理缺失數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 教你用python實現(xiàn)一個加密的文字處理器

    教你用python實現(xiàn)一個加密的文字處理器

    生活中有時候我們需要對一些重要的文件進(jìn)行加密,下面這篇文章主要給大家介紹了關(guān)于如何用python實現(xiàn)一個加密文字處理器的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 使用Python簡單實現(xiàn)去除彩色水印

    使用Python簡單實現(xiàn)去除彩色水印

    這篇文章主要為大家詳細(xì)介紹了如何使用Python簡單實現(xiàn)去除彩色水印效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • python交易記錄鏈的實現(xiàn)過程詳解

    python交易記錄鏈的實現(xiàn)過程詳解

    這篇文章主要介紹了python交易記錄鏈的實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 使用PyQt實現(xiàn)簡易文本編輯器

    使用PyQt實現(xiàn)簡易文本編輯器

    這篇文章主要為大家詳細(xì)介紹了如何使用PyQt5框架構(gòu)建一個簡單的文本編輯器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Python pydotplus安裝及可視化圖形創(chuàng)建教程

    Python pydotplus安裝及可視化圖形創(chuàng)建教程

    這篇文章主要為大家介紹了Python pydotplus安裝及可視化圖形創(chuàng)建教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • python sorted函數(shù)原理解析及練習(xí)

    python sorted函數(shù)原理解析及練習(xí)

    這篇文章主要介紹了python sorted函數(shù)原理解析及練習(xí),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Selenium操作隱藏的元素及問題解決方案

    Selenium操作隱藏的元素及問題解決方案

    這篇文章主要介紹了Selenium操作隱藏的元素及問題解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-12-12
  • Python命名空間的本質(zhì)和加載順序

    Python命名空間的本質(zhì)和加載順序

    這篇文章主要介紹了Python命名空間的本質(zhì)和加載順序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Python高效實現(xiàn)Excel轉(zhuǎn)PDF的輕量化方案

    Python高效實現(xiàn)Excel轉(zhuǎn)PDF的輕量化方案

    在數(shù)字化辦公場景中,Excel表格與PDF文檔的相互轉(zhuǎn)換是高頻需求,本文將聚焦無Office依賴的Python解決方案,通過第三方庫實現(xiàn)從Excel到PDF的高效轉(zhuǎn)換,感興趣的小伙伴可以了解下
    2025-10-10
  • 教你如何利用Python批量翻譯英文Word文檔并保留格式

    教你如何利用Python批量翻譯英文Word文檔并保留格式

    本文將給大家分享一個實用的Python辦公自動化腳本 利用Python批量翻譯英文Word文檔并保留格式,最終效果甚至比部分收費(fèi)的軟件還要好!文中有非常詳細(xì)的代碼示例.需要的朋友可以參考下
    2021-05-05

最新評論

沛县| 商城县| 达日县| 井研县| 波密县| 教育| 宁阳县| 茌平县| 方城县| 南华县| 惠东县| 开封市| 连山| 广汉市| 乐陵市| 永登县| 靖安县| 张北县| 来凤县| 青河县| 邳州市| 侯马市| 苏尼特左旗| 南投县| 盈江县| 临洮县| 军事| 花垣县| 鄢陵县| 鄂尔多斯市| 万盛区| 忻城县| 都匀市| 汝城县| 虹口区| 津南区| 比如县| 辛集市| 成都市| 泗洪县| 成安县|