【Pandas】pandas DataFrame dropna
Pandas2.2 DataFrame
Missing data handling
方法 | 描述 |
---|---|
DataFrame.fillna([value, method, axis, …]) | 用于填充 DataFrame 中的缺失值(NaN) |
DataFrame.backfill(*[, axis, inplace, …]) | 用于**使用后向填充(即“下一个有效观测值”)来填补缺失值(NaN)**的方法 |
DataFrame.bfill(*[, axis, inplace, limit, …]) | 用于**使用后向填充(即“下一个有效观测值”)来填补缺失值(NaN)**的方法 |
DataFrame.dropna(*[, axis, how, thresh, …]) | 用于删除包含缺失值(NaN)的行或列的方法 |
pandas.DataFrame.dropna()
pandas.DataFrame.dropna()
是一个用于删除包含缺失值(NaN)的行或列的方法。它是数据清洗中最常用的方法之一,适用于去除不完整数据、准备模型输入、生成干净数据集等场景。
📌 方法签名
DataFrame.dropna(*, axis=0, how=<no_default>, thresh=<no_default>, subset=None, inplace=False, ignore_index=False)
🔧 参数说明
参数 | 类型 | 说明 |
---|---|---|
axis | {0/'index', 1/'columns'} ,默认 0 | 删除方向: - 0 :按行删除- 1 :按列删除 |
how | {'any', 'all'} ,默认 'any' | 判断是否删除的标准: - 'any' :只要有一个 NaN 就删除- 'all' :整行/整列全为 NaN 才删除 |
thresh | int ,可选 | 非空值数量阈值,若某行/列非空值个数 < thresh 则删除 |
subset | list-like,可选 | 指定检查哪些列或行(取决于 axis )中的 NaN |
inplace | bool ,默认 False | 是否在原对象上修改 |
ignore_index | bool ,默认 False | 是否重置索引(从 0 开始) |
✅ 返回值
- 返回一个新的
DataFrame
,其中满足条件的行或列被删除; - 如果
inplace=True
,则返回None
,原始数据被修改。
🧪 示例代码及结果
示例 1:基本用法 - 删除含有任何 NaN 的行(默认)
import pandas as pd
import numpy as npdf = pd.DataFrame({'A': [1, 2, np.nan, 4],'B': [5, np.nan, np.nan, 8],'C': [9, 10, 11, 12]
})print("Original DataFrame:")
print(df)# 删除包含任何 NaN 的行
df_cleaned = df.dropna()
print("\nAfter dropna():")
print(df_cleaned)
输出结果:
Original DataFrame:A B C
0 1.0 5.0 9
1 2.0 NaN 10
2 NaN NaN 11
3 4.0 8.0 12After dropna():A B C
0 1.0 5.0 9
3 4.0 8.0 12
示例 2:设置 how='all'
- 只删除全为 NaN 的行
# 构造一行全为 NaN 的数据
df_with_all_nan = pd.DataFrame({'A': [1, np.nan, np.nan, 4],'B': [5, np.nan, np.nan, 8],'C': [9, np.nan, np.nan, 12]
})print("Original DataFrame (with all-NaN row):")
print(df_with_all_nan)# 只删除全为 NaN 的行
df_how_all = df_with_all_nan.dropna(how='all')
print("\nAfter dropna(how='all'):")
print(df_how_all)
输出结果:
Original DataFrame (with all-NaN row):A B C
0 1.0 5.0 9.0
1 NaN NaN NaN
2 NaN NaN NaN
3 4.0 8.0 12.0After dropna(how='all'):A B C
0 1.0 5.0 9.0
3 4.0 8.0 12.0
示例 3:使用 thresh
参数 - 控制最少非空值数量
# 设置每行至少要有 2 个非空值才保留
df_thresh = df.dropna(thresh=2)
print("\nAfter dropna(thresh=2):")
print(df_thresh)
输出结果:
After dropna(thresh=2):A B C
0 1.0 5.0 9
1 2.0 NaN 10
3 4.0 8.0 12
第二行只有一列非空(
C=11
),所以被删除。
示例 4:指定 subset
- 仅检查特定列是否有 NaN
# 只检查 'A' 和 'B' 列是否有 NaN
df_subset = df.dropna(subset=['A', 'B'])
print("\nAfter dropna(subset=['A', 'B']):")
print(df_subset)
输出结果:
After dropna(subset=['A', 'B']):A B C
0 1.0 5.0 9
3 4.0 8.0 12
虽然第三行
C
列没有问题,但因为A
或B
有 NaN,所以也被删除。
示例 5:按列删除(axis=1)
# 构造一些列含 NaN
df_col = pd.DataFrame({'X': [1, 2, 3],'Y': [np.nan, np.nan, np.nan],'Z': [7, np.nan, 9]
})print("Original Column-wise DataFrame:")
print(df_col)# 删除全为 NaN 的列
df_col_drop = df_col.dropna(axis=1, how='all')
print("\nAfter dropna(axis=1, how='all'):")
print(df_col_drop)
输出结果:
Original Column-wise DataFrame:X Y Z
0 1 NaN 7.0
1 2 NaN NaN
2 3 NaN 9.0After dropna(axis=1, how='all'):X Z
0 1 7.0
1 2 NaN
2 3 9.0
列
Y
全为 NaN,因此被删除。
示例 6:使用 ignore_index=True
重置索引
# 删除后重置索引
df_reset = df.dropna(ignore_index=True)
print("\nAfter dropna(ignore_index=True):")
print(df_reset)
输出结果:
After dropna(ignore_index=True):A B C
0 1.0 5.0 9
1 4.0 8.0 12
示例 7:原地修改(inplace=True)
# 原地修改
df.dropna(inplace=True)
print("\nIn-place dropna (modified original):")
print(df)
输出结果(基于示例 1 的数据):
In-place dropna (modified original):A B C
0 1.0 5.0 9
3 4.0 8.0 12
🧠 应用场景
- 数据清洗:去除不完整记录;
- 模型训练前预处理:确保输入数据无缺失;
- 统计分析:避免因缺失值影响计算结果;
- 可视化前清理数据:提高图表准确性;
- 链式调用中快速过滤:如
df.dropna().describe()
。
⚠️ 注意事项
- 默认删除行(
axis=0
),如需删除列请设置axis=1
; - 使用
how='any'
更严格,how='all'
更宽松; thresh
提供更灵活的控制;subset
可限制检查范围,提升效率;ignore_index=True
可避免后续操作受索引影响;- 不会自动排序索引,建议结合
reset_index()
使用; - 推荐先查看缺失情况(如
isna().sum()
)再决定如何处理。
✅ 总结对比
参数 | 功能 |
---|---|
how='any' | 只要有一个 NaN 就删除 |
how='all' | 整行/列都为 NaN 才删除 |
thresh=N | 至少 N 个非空值才保留 |
subset=[cols] | 仅检查指定列/行中的 NaN |
axis=1 | 删除列而不是行 |
ignore_index=True | 删除后重置索引 |
你可以根据具体需求选择最适合的参数组合来清理缺失值。