Pandas:如何获取.dropna()将移除的列/行的布尔指示数组
如何生成Pandas中
dropna()待移除行/列的布尔指示器 当然可以!你完全不需要真的执行删除操作,直接复刻dropna()的核心逻辑就能生成标记待移除行/列的布尔掩码——这在你想要先确认哪些数据会被过滤,或者要基于这个标记做后续处理时特别实用。
核心逻辑拆解
dropna()的行为由两个参数决定:how(判断规则)和axis(操作维度),我们只需要用isna()结合any()/all()就能完全复现这个判断逻辑:
1. 针对行(axis=0,dropna()默认维度)
当
how='any':只要行内存在任意缺失值就会被移除,对应的布尔掩码为:mask = df.isna().any(axis=1)(
isna()把缺失值转为True,any(axis=1)检查每行是否至少有一个True)当
how='all':只有行内所有值都是缺失值才会被移除,对应的布尔掩码为:mask = df.isna().all(axis=1)
2. 针对列(axis=1)
当
how='any':只要列内存在任意缺失值就会被移除,对应的布尔掩码为:mask = df.isna().any(axis=0)当
how='all':只有列内所有值都是缺失值才会被移除,对应的布尔掩码为:mask = df.isna().all(axis=0)
示例演示
我们用一个带缺失值的DataFrame来验证:
import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [1, np.nan, 3], 'B': [np.nan, np.nan, np.nan], 'C': [5, 6, 7] }) # 标记会被 dropna(how='any', axis=0) 移除的行 mask_rows_any = df.isna().any(axis=1) # 输出:0 False, 1 True, 2 False → 第二行会被移除 # 标记会被 dropna(how='all', axis=0) 移除的行 mask_rows_all = df.isna().all(axis=1) # 输出:0 False, 1 False, 2 False → 没有全缺失的行 # 标记会被 dropna(how='any', axis=1) 移除的列 mask_cols_any = df.isna().any(axis=0) # 输出:A True, B True, C False → A、B列会被移除 # 标记会被 dropna(how='all', axis=1) 移除的列 mask_cols_all = df.isna().all(axis=0) # 输出:A False, B True, C False → 只有B列会被移除
额外提示
- 如果需要保留的行/列的掩码,只需对结果取反:
~mask - 这个逻辑和
dropna()底层完全一致,你可以用df[~mask_rows_any]得到和df.dropna(how='any', axis=0)完全相同的结果
内容的提问来源于stack exchange,提问作者Daniil
相关产品推荐
相关产品推荐

