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

Pandas多列缺失值筛选:如何通过列列表实现DataFrame拆分?

解决DataFrame多列缺失值筛选的简洁写法

首先得指出你之前代码里的两个小问题:

  1. 最初的代码里columns变量没有定义,而且直接用df[df[columns].notnull()]的话,df[columns].notnull()返回的是布尔型DataFrame,你需要用all()或any()把每行的结果聚合为单个布尔值,才能用于行筛选。
  2. 你后来写的代码里,first_df和second_df用了完全相同的条件,这显然不符合你“生成两个不同DataFrame”的需求哦。

下面针对你的两个需求,给出无需逐个写逻辑运算符、仅用列列表实现的简洁写法,就算扩展到10列也一样好用:


需求1:创建指定列(如Race、Age)无缺失值的DataFrame

核心逻辑是:筛选出指定列的每一行都没有缺失值的记录。我们可以用notnull()生成布尔矩阵,再用all(axis=1)判断每行的所有指定列是否都为非空:

import pandas as pd

# 假设你的原始DataFrame是df
cols = ['Race', 'Age']  # 扩展到10列的话,直接写成cols = ['col1', 'col2', ..., 'col10']即可

# 需求1的实现:指定列都无缺失
first_df = df[df[cols].notnull().all(axis=1)]

all(axis=1)表示沿着行的方向(逐行)判断所有指定列的布尔值是否都为True(即都非空),完美替代了多个&连接的写法。


需求2:创建仅指定列(如Race、Age)存在缺失值的DataFrame

这里的“仅指定列存在缺失”应该是指:非指定列(比如Name)完全没有缺失,而指定列至少有一个缺失值。我们可以分两步判断后合并条件:

cols = ['Race', 'Age']

# 第一步:筛选非指定列都无缺失的行
non_cols = df.columns.difference(cols)
non_cols_no_null = df[non_cols].notnull().all(axis=1)

# 第二步:筛选指定列至少有一个缺失的行
cols_has_null = df[cols].isnull().any(axis=1)

# 需求2的实现:仅指定列存在缺失
second_df = df[non_cols_no_null & cols_has_null]

如果你的“仅指定列存在缺失”是指指定列有缺失即可、不关心其他列,那写法更简单:

second_df = df[df[cols].isnull().any(axis=1)]

这样不管你要处理2列还是10列,只需要修改cols列表里的列名即可,完全不用手动写一堆&逻辑运算符,代码更简洁也更易维护。

内容的提问来源于stack exchange,提问作者Rustem Sadykov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:27:34