Python实现移除标准差小于25百分位数的列
解决方案:移除DataFrame中低标准差列(兼容非数值型列)
你的核心需求是从大型DataFrame中移除标准差小于所有数值列标准差的25百分位数的列,同时要保证非数值型列不受影响——原代码的问题在于没有区分数值和非数值列,直接对所有列计算标准差和分位数,会导致非数值列出现NaN,进而被误筛掉。下面是鲁棒性更强的实现方案:
步骤说明
- 分离数值与非数值列:只有数值型列(整数/浮点)才有标准差的统计意义,先把它们和字符串、布尔等非数值列分开处理。
- 计算数值列的标准差分布:先算出所有数值列的标准差,再求这些标准差的25百分位数——这是我们筛选的阈值。
- 筛选符合条件的列:保留标准差≥阈值的数值列,再加上所有非数值列,得到最终的过滤后DataFrame。
完整代码实现
import pandas as pd # 示例数据 df = pd.DataFrame.from_dict({ 'a': [1,0,0,0,0,0,0,0,0,0,0], 'b': [1,1,2,3,1,0,0,0,0,0,0], 'c': ['Yes','No','Yes','No','Yes','No','Yes','No','Yes','No'], # 新增一个全相同的列,测试是否会被移除 'd': [5]*11 }) # 1. 分离数值列和非数值列 numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns non_numeric_cols = df.select_dtypes(exclude=['int64', 'float64']).columns # 2. 计算数值列的标准差,以及这些标准差的25百分位数 numeric_std = df[numeric_cols].std() std_25th_percentile = numeric_std.quantile(0.25) # 3. 筛选出需要保留的数值列:标准差≥25百分位数的列 keep_numeric = numeric_std[numeric_std >= std_25th_percentile].index # 4. 合并保留的数值列和所有非数值列,生成最终DataFrame filtered_df = df[keep_numeric.union(non_numeric_cols)] print("过滤前的列:", df.columns.tolist()) print("过滤后的列:", filtered_df.columns.tolist())
代码细节说明
- 示例中的
d列(全为5)标准差为0,远小于数值列标准差的25百分位数(约0.301),会被自动移除; - 非数值列
c会被完整保留,不参与任何统计计算,完全满足鲁棒性要求; - 如果你的DataFrame包含其他数值类型(比如
int32、float32),可以修改select_dtypes的include参数来覆盖。
运行结果
过滤前的列: ['a', 'b', 'c', 'd'] 过滤后的列: ['a', 'b', 'c']
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

