如何使用 Python pandas dropna() 從 DataFrame 中刪除 NA 值

介紹

在這個教程中,您將學習如何使用pandas的DataFrame dropna() 函數。

NA 值代表“不可用”。這可能適用於 NullNonepandas.NaTnumpy.nan。使用 dropna() 將刪除包含這些值的行和列。這對於提供只有有效數據的情況可能有益。

默認情況下,此函數返回一個新的DataFrame,而源DataFrame保持不變。

本教程已驗證適用於 Python 3.10.9、pandas 1.5.2 和 NumPy 1.24.1。

語法

dropna() 接受以下參數:

dropna(self, axis=0, how="any", thresh=None, subset=None, inplace=False)
  • axis{0(或 'index')、1(或 'columns')},默認為 0
  • 如果為 0,則刪除具有缺失值的行。
  • 如果為 1,則刪除具有缺失值的列。
  • how{'any'、'all'},默認為 'any'
  • 如果為 'any',則如果任何值為 NA,則刪除行或列。
  • 如果為 'all',則如果所有值都為 NA,則刪除行或列。
  • thresh:(可選)一個 int 值,用於指定丟棄操作的閾值。
  • subset:(可選)列標籤或標籤序列,用於指定行或列。
  • inplace:(可選)一個 bool 值。
  • 如果設置為 True,則更改源 DataFrame,並返回 None

構造示例 DataFrame

構造包含有效值和無效值的示例 DataFrame:

dropnaExample.py
import pandas as pd
import numpy as np

d1 = {
'Name': ['Shark', 'Whale', 'Jellyfish', 'Starfish'],
'ID': [1, 2, 3, 4],
'Population': [100, 200, np.nan, pd.NaT],
'Regions': [1, None, pd.NaT, pd.NaT]
}

df1 = pd.DataFrame(d1)
print(df1)

此代碼將打印出 DataFrame:

Output
Name ID Population Regions 0 Shark 1 100 1 1 Whale 2 200 None 2 Jellyfish 3 NaN NaT 3 Starfish 4 NaT NaT

然後添加第二個 DataFrame,其中包含帶有 NA 值的額外行和列:

d2 = {
'Name': ['Shark', 'Whale', 'Jellyfish', 'Starfish', pd.NaT],
'ID': [1, 2, 3, 4, pd.NaT],
'Population': [100, 200, np.nan, pd.NaT, pd.NaT],
'Regions': [1, None, pd.NaT, pd.NaT, pd.NaT],
'Endangered': [pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT]
}

df2 = pd.DataFrame(d2)
print(df2)

這將輸出一個新的 DataFrame:

Output
Name ID Population Regions Endangered 0 Shark 1 100 1 NaT 1 Whale 2 200 None NaT 2 Jellyfish 3 NaN NaT NaT 3 Starfish 4 NaT NaT NaT 4 NaT NaT NaT NaT NaT

您將在接下來的示例中使用上述 DataFrame。

刪除所有帶有遺失值的行

使用 dropna() 刪除帶有任何 NoneNaNNaT 值的行:

dropnaExample.py
dfresult = df1.dropna()
print(dfresult)

這將輸出:

Output
Name ID Population Regions 0 Shark 1 100 1

A new DataFrame with a single row that didn’t contain any NA values.

刪除所有含有缺失值的列

使用dropna()函數,並設置axis=1以刪除含有任何NoneNaNNaT值的列:

dfresult = df1.dropna(axis=1)
print(dfresult)

含有任何NoneNaNNaT值的列將被刪除:

Output
Name ID 0 Shark 1 1 Whale 2 2 Jellyfish 3 3 Starfish 4

A new DataFrame with a single column that contained non-NA values.

如果all值為Null,則刪除行或列,使用how

使用第二個DataFrame和how

dropnaExample.py
dfresult = df2.dropna(how='all')
print(dfresult)

所有值均為NA的行將被刪除:

Output
Name ID Population Regions Endangered 0 Shark 1 100 1 NaT 1 Whale 2 200 None NaT 2 Jellyfish 3 NaN NaT NaT 3 Starfish 4 NaT NaT NaT

第五行被刪除。

接下來,使用how並指定axis

dropnaExample.py
dfresult = df2.dropna(how='all', axis=1)
print(dfresult)

所有值均為NA的列將被刪除:

Output
Name ID Population Regions 0 Shark 1 100 1 1 Whale 2 200 None 2 Jellyfish 3 NaN NaT 3 Starfish 4 NaT NaT 4 NaT NaT NaT NaT

第五列被刪除。

如果閾值被越過,則刪除行或列使用 thresh

使用具有 thresh 的第二個 DataFrame 刪除不符合至少 3 個非 NA 值的閾值的行:

dropnaExample.py
dfresult = df2.dropna(thresh=3)
print(dfresult)

不具有至少 3 個非 NA 的行將被刪除:

Output
Name ID Population Regions Endangered 0 Shark 1 100 1 NaT 1 Whale 2 200 None NaT

第三、第四和第五行被刪除。

針對特定 子集 刪除行或列

使用具有 subset 的第二個 DataFrame 刪除在 Population 列中具有 NA 值的行:

dropnaExample.py
dfresult = df2.dropna(subset=['Population'])
print(dfresult)

具有 Population 具有 NA 值的行將被刪除:

Output
Name ID Population Regions Endangered 0 Shark 1 100 1 NaT 1 Whale 2 200 None NaT

第三、第四和第五行被刪除。

在從 DataFrame 刪除列時,您也可以指定 subset 中的 index 值:

dropnaExample.py
dfresult = df2.dropna(subset=[1, 2], axis=1)
print(dfresult)

在行 12 的子集中包含 NA 值的列:

Output
Name ID 0 Shark 1 1 Whale 2 2 Jellyfish 3 3 Starfish 4 4 NaT NaT

第三、第四和第五列被刪除。

在删除行或列后更改源DataFrame

默认情况下,dropna()不会修改源DataFrame。但在某些情况下,您可能希望通过使用inplace来在处理大型源DataFrame时节省内存。

dropnaExample.py
df1.dropna(inplace=True)
print(df1)

此代码不使用dfresult变量。

这将输出:

Output
Name ID Population Regions 0 Shark 1 100 1

原始DataFrame已被修改。

结论

在本文中,您使用dropna()函数来删除带有NA值的行和列。

继续学习更多关于Python和pandas的教程 – Python pandas模块教程pandas删除重复行

参考资料

Source:
https://www.digitalocean.com/community/tutorials/pandas-dropna-drop-null-na-values-from-dataframe