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

Python/Pandas:仅针对数值列移除含异常值的行(解决类型错误)

解决含分类列数据集的数值列异常值移除问题

你碰到的这个问题太常见了——stats.zscore()默认会对DataFrame里的所有列计算Z值,但分类列是字符串类型,根本没法和数值做运算,自然就触发类型错误了。解决思路很直接:只针对数值型列做异常值检测,完全跳过分类列就行。

具体实现步骤

  1. 精准筛选数值列:用Pandas的select_dtypes()方法,把所有int、float类型的列挑出来,排除掉字符串、分类类型的列。
  2. 仅对数值列计算Z-score:把筛选后的数值列传入stats.zscore(),再判断每行的所有数值列是否都满足Z值绝对值小于3。
  3. 保留合规行:用布尔索引过滤出没有异常值的行,分类列会原封不动保留。

完整示例代码

import numpy as np
import pandas as pd
from scipy import stats

# 模拟你的数据集(包含数值列和分类列)
df = pd.DataFrame({
    'height': [160, 170, 180, 220, 175],
    'weight': [55, 65, 75, 150, 70],
    'occupation': ['teacher', 'engineer', 'doctor', 'artist', 'nurse'],
    'marital_status': ['single', 'married', 'married', 'single', 'married']
})

# 第一步:筛选所有数值型列
numeric_cols = df.select_dtypes(include=['number']).columns

# 第二步:计算数值列的Z-score,过滤掉存在异常值的行
df_cleaned = df[(np.abs(stats.zscore(df[numeric_cols])) < 3).all(axis=1)]

print("原始数据集:")
print(df)
print("\n移除异常值后的数据集:")
print(df_cleaned)

额外提醒

如果你的分类列是用数值编码的(比如用0/1表示婚姻状态),记得先把它们转换成category类型,避免被误当成数值列处理:

df['marital_encoded'] = df['marital_encoded'].astype('category')

这个方法不会改变原始数据的列顺序,分类列会和数值列一起保留,只是移除了数值列存在异常值的行。

内容的提问来源于stack exchange,提问作者px06

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:09:52