Python/Pandas:仅针对数值列移除含异常值的行(解决类型错误)
解决含分类列数据集的数值列异常值移除问题
你碰到的这个问题太常见了——stats.zscore()默认会对DataFrame里的所有列计算Z值,但分类列是字符串类型,根本没法和数值做运算,自然就触发类型错误了。解决思路很直接:只针对数值型列做异常值检测,完全跳过分类列就行。
具体实现步骤
- 精准筛选数值列:用Pandas的
select_dtypes()方法,把所有int、float类型的列挑出来,排除掉字符串、分类类型的列。 - 仅对数值列计算Z-score:把筛选后的数值列传入
stats.zscore(),再判断每行的所有数值列是否都满足Z值绝对值小于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
相关产品推荐
相关产品推荐

