You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:22:35