Pandas多列缺失值筛选:如何通过列列表实现DataFrame拆分?
解决DataFrame多列缺失值筛选的简洁写法
首先得指出你之前代码里的两个小问题:
- 最初的代码里
columns变量没有定义,而且直接用df[df[columns].notnull()]的话,df[columns].notnull()返回的是布尔型DataFrame,你需要用all()或any()把每行的结果聚合为单个布尔值,才能用于行筛选。 - 你后来写的代码里,
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
相关产品推荐
相关产品推荐

