如何删除方差处于指定容差区间内的Pandas DataFrame列
Pandas按指定方差区间删除列的实现方案
报错原因
你遇到的报错是因为Pandas不支持0 < df.std() < 0.0001这种链式比较写法:Python的链式比较底层依赖and逻辑运算符,而df.std()/df.var()返回的是Series对象,Pandas规定不能直接对Series使用and/or这类原生逻辑运算符,因此抛出值错误。
正确实现代码
你可以通过位运算符生成过滤掩码实现需求,同时支持自动保留非数值类型的列:
import pandas as pd # 示例DataFrame构造 d={'month': ['01/01/2020', '01/02/2020', '01/03/2020', '01/01/2020', '01/02/2020', '01/03/2020'], 'country': ['Japan', 'Japan', 'Japan', 'Poland', 'Poland', 'Poland'], 'level':['A01', 'A01', 'A01', 'A00','A00', 'A00'], 'job title':['Insights Manager', 'Insights Manager', 'Insights Manager', 'Sales Director', 'Sales Director', 'Sales Director'], 'number':[0, 0.001, 0, 0, 0, 0], 'age':[24, 22, 45, 38, 60, 32]} df=pd.DataFrame(d) # 定义方差过滤区间 var_low = 0 var_high = 0.0001 # 计算所有列的方差,非数值列的方差结果为NaN,填充为大于阈值的数值以默认保留 col_var = df.var(numeric_only=False).fillna(var_high + 1) # 生成保留列的掩码:取反掉方差落在指定区间的列 keep_col_mask = ~((col_var >= var_low) & (col_var <= var_high)) # 筛选得到最终DataFrame df = df.loc[:, keep_col_mask]
执行效果
运行后会自动删除方差在0~0.0001区间的number列,保留其余所有非数值列和方差符合要求的age列。
内容的提问来源于stack exchange,提问作者AlSub
相关产品推荐
相关产品推荐

