如何在Pandas中高效检测类布尔型列(含True、False或NaN)
高效识别可转换为布尔型的Object列
问题背景
我有如下DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame( { 'date':"20220701", 'a':[1,2,np.NaN], 'b':['a', 'b', 'c'], 'c':[True, False, np.NaN] } )
其中列b和c的数据类型为object。需要高效筛选出那些**仅包含布尔值(True/False)和缺失值(NaN)**的列——也就是如果没有缺失值,该列可以直接转换为布尔类型。
现有方案分析
我目前想到两种思路:
- 检查列的唯一值是否属于
{True, False, np.NaN}:这种方法需要先提取唯一值,大数据集下unique()操作会占用较多内存和时间,效率确实偏低。 - 逐行验证:用
(df[col].isnull() | (df[col] == True) | (df[col] == False)).all()判断整列是否都满足“是缺失值或布尔值”:这种方法比第一种高效,但数据量极大时,逐元素判断的开销仍不可忽视。
更高效的优化方案
方案1:利用infer_dtype快速判断
Pandas内置的infer_dtype可以识别包含布尔值和缺失值的列,返回字符串'boolean',内部逻辑经过优化,效率很高:
def is_boolean_with_nan(col): return pd.api.types.infer_dtype(col, skipna=True) == 'boolean' # 筛选所有符合条件的object列 target_cols = [col for col in df.columns if df[col].dtype == 'object' and is_boolean_with_nan(df[col])] # 输出结果: ['c']
方案2:批量转换验证
对object列尝试强制转换为boolean类型(允许保留缺失值),转换成功则说明是目标列:
target_cols = [] for col in df.columns: if df[col].dtype != 'object': continue try: # 尝试转换为带缺失值的布尔型 df[col].astype('boolean') target_cols.append(col) except ValueError: pass # 输出结果: ['c']
方案3:向量化统计无效值
用np.isin快速统计列中不属于{True, False, np.NaN}的元素数量,若数量为0则是目标列:
def is_valid_boolean_col(col): invalid_count = (~np.isin(col, [True, False, np.NaN])).sum() return invalid_count == 0 target_cols = [col for col in df.columns if df[col].dtype == 'object' and is_valid_boolean_col(df[col])]
内容的提问来源于stack exchange,提问作者ira
相关产品推荐
相关产品推荐

