HOWTO · Pandas

Pandas 删除带有 NaN 的行

本教程解释了我们如何使用 DataFrame.notna()和 DataFrame.dropna()方法来删除所有带有 NaN 值的行。

本页内容

本教程解释了我们如何使用 DataFrame.notna()DataFrame.dropna() 方法删除所有带有 NaN 值的行。

我们将在下面的示例代码中使用 DataFrame。

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

data = pd.DataFrame(
    {
        "Name": ["Alice", "Steven", "Neesham", "Chris", "Alice"],
        "Age": [19, None, 18, 21, None],
        "Income($)": [4000, 5000, None, 3500, None],
        "Expense($)": [3000, 2000, 2500, 25000, None],
    }
)

print(data)

输出:

      Name   Age  Income($)  Expense($)
0    Alice  19.0     4000.0      3000.0
1   Steven   NaN     5000.0      2000.0
2  Neesham  18.0        NaN      2500.0
3    Chris  21.0     3500.0     25000.0
4    Alice   NaN        NaN         NaN

Pandas 使用 DataFrame.notna() 方法删除带有 NaN 的行

DataFrame.notna() 方法返回一个布尔对象,其行数和列数与调用者 DataFrame 相同。如果元素不是 NaN,它将被映射到布尔对象中的 True 值,如果元素是 NaN,它将被映射到 False 值。

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

data = pd.DataFrame(
    {
        "Name": ["Alice", "Steven", "Neesham", "Chris", "Alice"],
        "Age": [19, None, 18, 21, None],
        "Income($)": [4000, 5000, None, 3500, None],
        "Expense($)": [3000, 2000, 2500, 25000, None],
    }
)
print("Initial DataFrame:")
print(data)

print("")

data = data[data["Income($)"].notna()]
print("DataFrame after removing rows with NaN value in Income Field:")
print(data)

输出:

Initial DataFrame:
      Name   Age  Income($)  Expense($)
0    Alice  19.0     4000.0      3000.0
1   Steven   NaN     5000.0      2000.0
2  Neesham  18.0        NaN      2500.0
3    Chris  21.0     3500.0     25000.0
4    Alice   NaN        NaN         NaN

DataFrame after removing rows with NaN value in Income Field:
     Name   Age  Income($)  Expense($)
0   Alice  19.0     4000.0      3000.0
1  Steven   NaN     5000.0      2000.0
3   Chris  21.0     3500.0     25000.0

这里,我们将 notna() 方法应用于 dataIncome($) 列,它将返回一个系列对象,根据该列的值,有 TrueFalse 值。当我们将布尔对象作为索引传递给原始 DataFrame 时,我们只得到 Income($) 列没有 NaN 值的行。

Pandas 使用 DataFrame.dropna() 方法只删除所有列都是 NaN 值的行

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

data = pd.DataFrame(
    {
        "Id": [621, 645, 210, 345, None],
        "Age": [19, None, 18, 21, None],
        "Income($)": [4000, 5000, None, 3500, None],
        "Expense($)": [3000, 2000, 2500, 25000, None],
    }
)
print("Initial DataFrame:")
print(data)

print("")

data = data.dropna(how="all")
print("DataFrame after removing rows with NaN value in All Columns:")
print(data)

输出:

Initial DataFrame:
      Id   Age  Income($)  Expense($)
0  621.0  19.0     4000.0      3000.0
1  645.0   NaN     5000.0      2000.0
2  210.0  18.0        NaN      2500.0
3  345.0  21.0     3500.0     25000.0
4    NaN   NaN        NaN         NaN

DataFrame after removing rows with NaN value in All Columns:
      Id   Age  Income($)  Expense($)
0  621.0  19.0     4000.0      3000.0
1  645.0   NaN     5000.0      2000.0
2  210.0  18.0        NaN      2500.0
3  345.0  21.0     3500.0     25000.0

它只删除 DataFrame 中所有字段中含有 NaN 值的行。我们在 dropna() 方法中设置 how='all',让该方法只在行的所有列值都是 NaN 时才删除行。

Pandas 使用 DataFrame.dropna() 方法仅在某一列的值为 NaN 的情况下才删除行

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

data = pd.DataFrame(
    {
        "Id": [621, 645, 210, 345, None],
        "Age": [19, None, 18, 21, None],
        "Income($)": [4000, 5000, None, 3500, None],
        "Expense($)": [3000, 2000, 2500, 25000, None],
    }
)
print("Initial DataFrame:")
print(data)

print("")

data = data.dropna(subset=["Id"])
print("DataFrame after removing rows with NaN value in Id Column:")
print(data)

输出:

Initial DataFrame:
      Id   Age  Income($)  Expense($)
0  621.0  19.0     4000.0      3000.0
1  645.0   NaN     5000.0      2000.0
2  210.0  18.0        NaN      2500.0
3  345.0  21.0     3500.0     25000.0
4    NaN   NaN        NaN         NaN

DataFrame after removing rows with NaN value in Id Column:
      Id   Age  Income($)  Expense($)
0  621.0  19.0     4000.0      3000.0
1  645.0   NaN     5000.0      2000.0
2  210.0  18.0        NaN      2500.0
3  345.0  21.0     3500.0     25000.0

它将删除 DataFrame 中所有仅在 Id 列中具有 NaN 值的列。

Pandas 使用 DataFrame.dropna() 方法删除任意列为 NaN 值的行

import pandas as pd

roll_no = [501, 502, 503, 504, 505]

data = pd.DataFrame(
    {
        "Id": [621, 645, 210, 345, None],
        "Age": [19, None, 18, 21, None],
        "Income($)": [4000, 5000, None, 3500, None],
        "Expense($)": [3000, 2000, 2500, 25000, None],
    }
)
print("Initial DataFrame:")
print(data)

print("")

data = data.dropna()
print("DataFrame after removing rows with NaN value in any column:")
print(data)

输出:

Initial DataFrame:
      Id   Age  Income($)  Expense($)
0  621.0  19.0     4000.0      3000.0
1  645.0   NaN     5000.0      2000.0
2  210.0  18.0        NaN      2500.0
3  345.0  21.0     3500.0     25000.0
4    NaN   NaN        NaN         NaN

DataFrame after removing rows with NaN value in any column:
      Id   Age  Income($)  Expense($)
0  621.0  19.0     4000.0      3000.0
3  345.0  21.0     3500.0     25000.0

默认情况下,dropna() 方法将删除所有至少有一个 NaN 值的行。