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

如何清洗含字符串值的数据集,解决99999替换NaN失败及zscore报错问题

问题根源
  • 包含LOHARU、NUH等字符串的列数据类型为object,该列中的99999实际是字符串格式的'99999',和你替换规则里的数字99999不匹配,因此替换失败
  • zscore计算需要全数值类型输入,数据集包含字符串列,直接调用stats.zscore会触发类型错误
完整解决步骤

1. 拆分数值列和非数值列

先将字符串列单独拆分出来,不参与数值类运算:

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

# 读取本地数据集
dataset = pd.read_csv('trial.csv', header=None) # 如果数据集有表头可以删除header=None参数

# 拆分字符串列(示例中字符串为第2列,索引从0开始为1,可根据实际列位置调整)
str_col = dataset[1]
# 提取所有数值列
num_cols = dataset.drop(columns=[1])

2. 替换99999和0为NaN

先统一数值列的类型,解决字符串格式数字匹配失败的问题:

# 将数值列统一转为浮点型,无法转换的异常字符串会自动转为NaN
num_cols = num_cols.apply(pd.to_numeric, errors='coerce')

# 替换所有99999为NaN
num_cols = num_cols.replace(99999, np.nan)

# 按规则替换0为NaN,排除允许保留0的列(列索引根据你的实际列数调整)
cols_allow_zero = [12,14,17]
cols_replace_zero = [col for col in num_cols.columns if col not in cols_allow_zero]
num_cols[cols_replace_zero] = num_cols[cols_replace_zero].replace(0, np.nan)

3. 缺失值统计

# 合并字符串列得到清洗后的完整数据集
cleaned_dataset = pd.concat([num_cols, str_col], axis=1)
# 输出各列缺失值数量
print(cleaned_dataset.isnull().sum())

4. 异常值检测

仅在数值列上计算zscore,避免类型错误:

# 可选:先填充缺失值(也可以直接删除含缺失值的行,根据你的业务需求选择)
num_cols_filled = num_cols.fillna(num_cols.median())
# 计算zscore
z_scores = stats.zscore(num_cols_filled)

# 通用规则:zscore绝对值大于3判定为异常值
outlier_mask = (np.abs(z_scores) > 3).any(axis=1)
print(f"检测到异常值行数:{outlier_mask.sum()}")
# 提取异常值行
outlier_rows = cleaned_dataset[outlier_mask]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:45:03