现在位置: 首页 > Pandas 教程 > 正文

Pandas df.dropna() 函数

Pandas 常用函数 Pandas 常用函数


df.dropna() 是 Pandas 中用于删除含有缺失值的行或列的函数。

在数据分析中,缺失值(NaNNoneNULL)是常见的问题。dropna() 函数提供了一种简单的方式来清理数据,你可以选择删除包含缺失值的行、列,或者根据缺失值的比例来筛选数据。


基本语法与参数

dropna() 是 DataFrame 的成员函数,通过点运算符 . 来调用。

语法格式

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

参数说明

参数 类型 是否必填 说明 默认值
axis int 或 str 可选 指定删除行还是列。0'index' 表示删除含有缺失值的行;1'columns' 表示删除含有缺失值的列。 0
how str 可选 指定删除条件。'any' 表示只要有缺失值就删除;'all' 表示全部为缺失值才删除。 'any'
thresh int 可选 设置非缺失值的最小数量。如果行(或列)中非缺失值的数量少于 thresh,则删除该行(或列)。 None
subset array-like 可选 指定在哪些列(或行)中检查缺失值。如果 axis=0,则 subset 指定列名;如果 axis=1,则 subset 指定行索引。 None
inplace bool 可选 如果为 True,直接在原 DataFrame 上修改,不返回新对象;如果为 False,返回一个新的 DataFrame,原数据不变。 False

返回值说明

  • 返回一个新的 DataFrame(如果 inplace=False),或者 None(如果 inplace=True)。
  • 返回的 DataFrame 中不包含含有缺失值的行或列。

实例

让我们通过一系列例子,彻底掌握 dropna() 的用法。

示例 1:删除含有缺失值的行

这是最常见的用法,删除任何包含缺失值的行。

实例

import pandas as pd
import numpy as np

# 创建一个包含缺失值的 DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '年龄': [25, 30, np.nan, 35, 28],  # 王五的年龄缺失
    '薪资': [5000, 6000, 5500, np.nan, 7000],  # 赵六的薪资缺失
    '部门': ['技术', '市场', '技术', '市场', '技术']
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 删除含有缺失值的行(默认行为)
df_cleaned = df.dropna()

print("删除缺失值后的数据:")
print(df_cleaned)

运行结果预期:

原始数据:
    姓名   年龄    薪资  部门
0  张三  25.0  5000.0  技术
1  李四  30.0  6000.0  市场
2  王五   NaN  5500.0  技术
3  赵六  35.0     NaN  市场
4  钱七  28.0  7000.0  技术
==================================================
删除缺失值后的数据:
    姓名   年龄    薪资  部门
0  张三  25.0  5000.0  技术
1 李四  30.0  6000.0  市场
4  钱七  28.0  7000.0  技术

代码解析:

  1. 我们创建了一个包含缺失值的 DataFrame,其中王五的年龄是 NaN,赵六的薪资是 NaN
  2. 使用 df.dropna() 默认参数,删除了所有含有缺失值的行。
  3. 结果保留了张三、李四和钱七的数据,删除了王五和赵六。

示例 2:删除含有缺失值的列

有时候我们更关心哪些列有缺失值,可以选择删除列。

实例

import pandas as pd
import numpy as np

# 创建一个包含缺失值的 DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 35, 40],
    '薪资': [5000, np.nan, 5500, np.nan],  # 多列都有缺失值
    '部门': [np.nan, '市场', '技术', '市场'],
    '城市': ['北京', '上海', '广州', '深圳']  # 无缺失值
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 删除含有缺失值的列
df_cleaned = df.dropna(axis=1)

print("删除缺失值列后的数据:")
print(df_cleaned)

运行结果预期:

原始数据:
    姓名  年龄    薪资  部门  城市
0  张三  25  5000.0  NaN  北京
1  李四  30     NaN  市场  上海
2  王五  35  5500.0  技术  广州
3  赵六  40     NaN  市场  深圳
==================================================
删除缺失值列后的数据:
    姓名  年龄  城市
0  张三  25  北京
1  李四  30  上海
2  王五  35  广州
3  赵六  40  深圳

代码解析:

  • 设置 axis=1 表示按列操作。
  • 薪资和部门列包含缺失值,因此被删除。
  • 姓名、年龄和城市列没有缺失值,保留了下来。

示例 3:使用 thresh 参数控制删除条件

thresh 参数允许你设置非缺失值的最小数量,只有当行(或列)中非缺失值的数量低于这个阈值时才删除。

实例

import pandas as pd
import numpy as np

# 创建一个 DataFrame,每行都有一些缺失值
data = {
    'A': [1, 2, np.nan, 4, 5],
    'B': [np.nan, 2, 3, 4, np.nan],  # 有2个缺失值
    'C': [1, 2, 3, 4, 5],  # 无缺失值
    'D': [np.nan, np.nan, np.nan, 4, 5]  # 有3个缺失值
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 只保留至少有3个非缺失值的行
df_cleaned = df.dropna(thresh=3)

print("保留至少3个非缺失值的行:")
print(df_cleaned)

运行结果预期:

原始数据:
     A    B  C    D
0  1.0  NaN  1.0  NaN
1  2.0  2.0  2.0  NaN
2  NaN  3.0  3.0  NaN
3  4.0  4.0 4.0  4.0
4  5.0  NaN  5.0  5.0
==================================================
保留至少3个非缺失值的行:
     A    B  C    D
1  2.0  2.0  2.0  NaN
3  4.0  4.0 4.0  4.0

代码解析:

  • 第0行只有1个非缺失值(1.0),被删除。
  • 第1行有3个非缺失值(2.0, 2.0, 2.0),保留。
  • 第2行只有2个非缺失值(3.0, 3.0),被删除。
  • 第3行有4个非缺失值,保留。
  • 第4行只有3个非缺失值(5.0, 5.0, 5.0),保留。

示例 4:使用 subset 指定检查列

有时候我们只关心特定列是否有缺失值,可以使用 subset 参数。

实例

import pandas as pd
import numpy as np

# 创建一个 DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, np.nan, 35, 40],  # 李四的年龄缺失
    '薪资': [5000, 6000, np.nan, 8000],  # 王五的薪资缺失
    '部门': ['技术', '市场', '技术', '市场']
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 只在"姓名"和"部门"列检查缺失值
df_cleaned = df.dropna(subset=['姓名', '部门'])

print("只在姓名和部门列检查缺失值后的数据:")
print(df_cleaned)
print("=" * 50)

# 只在"薪资"列检查缺失值
df_cleaned2 = df.dropna(subset=['薪资'])

print("只在薪资列检查缺失值后的数据:")
print(df_cleaned2)

运行结果预期:

原始数据:
    姓名   年龄    薪资  部门
0  张三  25.0  5000.0  技术
1  李四   NaN  6000.0  市场
2  王五  35.0     NaN  技术
3  赵六  40.0  8000.0  市场
==================================================
只在姓名和部门列检查缺失值后的数据:
    姓名   年龄    薪资  部门
0  张三  25.0  5000.0  技术
1  李四   NaN  6000.0  市场
2  王五  35.0     NaN  技术
3  赵六  40.0  8000.0  市场
==================================================
只在薪资列检查缺失值后的数据:
    姓名   年龄    薪资  部门
0  张三  25.0  5000.0  技术
1  李四  30.0  6000.0  市场
3  赵六  40.0  8000.0  市场

代码解析:

  • 姓名和部门列没有缺失值,所以检查后所有行都保留。
  • 薪资列中王五的薪资是 NaN,所以第2行被删除。

示例 5:使用 how='all' 只删除全为缺失值的行

how='all' 参数表示只有当行(或列)中所有值都是缺失值时才删除。

实例

import pandas as pd
import numpy as np

# 创建一个 DataFrame,包含一些全部为缺失值的行
data = {
    'A': [1, np.nan, np.nan, 4],
    'B': [2, np.nan, np.nan, 5],
    'C': [3, np.nan, np.nan, 6]
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)
print("=" * 50)

# 删除全部为缺失值的行
df_cleaned = df.dropna(how='all')

print("删除全部为缺失值的行后:")
print(df_cleaned)

运行结果预期:

原始数据:
     A    B    C
0  1.0  2.0  3.0
1  NaN  NaN  NaN
2  NaN  NaN  NaN
3  4.0  5.0  6.0
==================================================
删除全部为缺失值的行后:
     A    B    C
0  1.0  2.0  3.0
3  4.0  5.0  6.0

代码解析:

  • 第1行和第2行所有值都是 NaN,使用 how='all' 将它们删除。
  • 第0行和第3行有实际数据,保留了下来。

注意事项

  • dropna() 默认不会修改原始 DataFrame,如果想原地修改,使用 inplace=True 参数。
  • 使用 thresh 参数时,设置的值应该基于你对数据质量的要求。
  • 在删除数据之前,建议先使用 df.isnull().sum() 查看每列缺失值的数量,做出更明智的决策。
  • 对于重要的数据集,慎重使用 dropna(),因为这可能会导致大量数据丢失,可以考虑使用 fillna() 来填充缺失值。

Pandas 常用函数 Pandas 常用函数