如何清洗含字符串值的数据集,解决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
相关产品推荐
相关产品推荐

