如何使用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

然后添加一个具有NA值的附加行和列的第二个DataFrame:

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.

如果所有值均为Null,则删除行或列,并使用how

使用第二个数据框和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)

包含subset中行12NA值的列:

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