pandas索引选择原理:df.columns[df.isna().any()]运行逻辑解析
df.columns[df.isna().any()] 执行逻辑拆解 这个语句能生效的核心是pandas通用的布尔索引规则,按执行顺序拆解开就很清楚:
分步执行流程
- 第一步:执行
df.isna()
逐单元格判断是否为空值,返回和原DataFrame行列完全对齐的布尔型DataFrame,空值位置为True,非空位置为False。 - 第二步:执行
.any()
该方法默认参数axis=0,即沿着行方向逐列做判断:只要一列里存在任意一个True(也就是存在空值),该列的最终判断结果就为True。这一步输出的就是你贴出来的布尔Series:索引是原DataFrame的所有列名,值为对应列是否包含空值的布尔结果,且值的顺序和原DataFrame列的顺序完全一致。 - 第三步:理解
df.columns的本质df.columns不是什么特殊结构,就是pandas的Index序列对象,按表中列的从左到右顺序存储了所有列名,和上一步输出的布尔Series的长度、顺序完全对齐。 - 第四步:布尔索引筛选
对pandas里的所有序列类对象(Index、Series、甚至DataFrame行),只要传入长度相等、顺序对齐的布尔序列做索引,就会自动保留布尔值为True位置对应的元素,丢弃False位置的元素。
对应你给出的示例输出,对齐关系如下:
位置序号 列名(df.columns元素) 是否含空值(布尔Series值) 筛选结果 0 Survived False 丢弃 1 Pclass False 丢弃 2 Name False 丢弃 3 Sex False 丢弃 4 Age True 保留 5 SibSp False 丢弃 6 Parch False 丢弃 7 Ticket False 丢弃 8 Fare False 丢弃 9 Cabin True 保留 10 Embarked True 保留
最终筛选输出的结果就是所有含空值的列名:Index(['Age', 'Cabin', 'Embarked'], dtype='object')。
注意点
这个写法默认依赖布尔Series和df.columns的顺序对齐,如果担心索引顺序错乱导致筛选错误,可以把布尔值转成无索引的数组再做筛选,写法为df.columns[df.isna().any().to_numpy()],此时会严格按位置匹配,不受索引顺序影响。
内容的提问来源于stack exchange,提问作者Noman
相关产品推荐
相关产品推荐

