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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:42:55