当前位置: 首页 > web >正文

【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 才删除
threshint,可选非空值数量阈值,若某行/列非空值个数 < thresh 则删除
subsetlist-like,可选指定检查哪些列或行(取决于 axis)中的 NaN
inplacebool,默认 False是否在原对象上修改
ignore_indexbool,默认 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 列没有问题,但因为 AB 有 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删除后重置索引

你可以根据具体需求选择最适合的参数组合来清理缺失值。

http://www.xdnf.cn/news/13127.html

相关文章:

  • Linux安装字体
  • Python抽象基类注册机制解析:优雅实现接口兼容的艺术
  • 基于 HTTP 的单向流式通信协议SSE详解
  • Android Framework预装traceroute执行文件到system/bin下
  • JS红宝书10.1-10.5 函数
  • PHP7内核剖析 学习笔记 第十章 扩展开发(1)
  • 【蓝桥杯嵌入式】【复盘】第15届国赛真题
  • 7种分类数据编码技术详解:从原理到实战
  • Java基于BS架构的OA流程可视化实战:从工作流引擎到前端交互(附完整源代码+论文框架)
  • 学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
  • ubuntu22.04有线网络无法连接,图标也没了
  • QT 仿网易云项目
  • React Native 开发环境搭建(全平台详解)
  • LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
  • 开始新的认识,对worldquant(50alpha)
  • NLP-文本表征(2011-2022)
  • 中国政务数据安全建设细化及市场需求分析
  • API网关Envoy的鉴权与限流:构建安全可靠的微服务网关
  • C++--string的模拟实现
  • JS红宝书笔记 - 3.3 变量
  • Spring Boot面试题精选汇总
  • 记录:外扩GPIOD访问报警告
  • 在ARM+Ascend NPU上适配Step-Audio模型
  • AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
  • 初识Docker——容器化革命核心概念
  • 解决HuggingFace不能git clone的问题
  • 基于Spring的Java公共资源模块开发与最佳实践
  • 在 Word中生成目录(Table of Contents, TOC)
  • MaaS与CC有哪些契合点
  • 在 Windows 11/10 中打开任务管理器的 6 种方法(无需 Ctrl+Alt+Delete)