Pandas df.dropna() 函数
df.dropna() 是 Pandas 中用于删除含有缺失值的行或列的函数。
在数据分析中,缺失值(NaN、None 或 NULL)是常见的问题。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)
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 技术
代码解析:
- 我们创建了一个包含缺失值的 DataFrame,其中王五的年龄是
NaN,赵六的薪资是NaN。 - 使用
df.dropna()默认参数,删除了所有含有缺失值的行。 - 结果保留了张三、李四和钱七的数据,删除了王五和赵六。
示例 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)
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)
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)
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)
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 常用函数