如何使用pandas处理数据集中数值列混入字符串的问题
问题背景
处理数据集时,其中某列存在混合字符串和数字的取值,执行缺失值替换、异常值计算操作时均出现错误。
样例数据集如下:
1.99 LOHARU 0.3 2 0 2 0.3 5 2 0 2 2 1.99 31 0.76 2 0 2 0.76 5 2 7.48 4 2 1.99 4 0.96 2 0 2 0.96 5 2 9.45 4 2 1.99 14 1.26 4 0 2 1.26 5 2 0 2 2 1.99 NUH 0.55 2 0 2 0.55 5 2 0.67 2 2 1.99 99999 0.29 2 0 2 0.29 5 2 0.06 2 2
问题1:99999未被替换为NaN
你原先使用的代码:
# 将0和99999替换为NAN dataset[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]]=dataset[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]].replace(99999,np.NaN) #if 12,14和17可以有零值则执行以下替换 dataset[[0,1,2,3,4,5,6,7,8,9,10,11,13,15,16]]=dataset[[0,1,2,3,4,5,6,7,8,9,10,11,13,15,16]].replace(0,np.NaN) print(Dataset.isnull().sum())
故障原因
- 数据类型不匹配:索引为1的列混合了字符串和数字,整体为object类型,其中的99999是字符串格式
'99999',你替换的目标是整数99999,类型不一致导致匹配失败。 - 变量名大小写错误:代码中变量名一会写
dataset一会写Dataset,大小写不一致会触发找不到变量的报错。
修复方案
替换时同时匹配字符串和数字格式的目标值,统一变量名:
import numpy as np # 同时替换整数和字符串格式的99999、0 replace_values = {99999: np.nan, '99999': np.nan, 0: np.nan, '0': np.nan} cols_all = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] dataset[cols_all] = dataset[cols_all].replace(replace_values) print(dataset.isnull().sum())
问题2:计算zscore时报
TypeError: unsupported operand type(s) for /: 'str' and 'int' 你原先使用的代码:
import scipy.stats as stats array = Dataset.values Z=stats.zscore(array)
故障原因
数据集包含字符串类型的列(比如索引为1的列里的LOHARU、NUH等值),直接把整个数据集转成数组后存在字符串元素,无法参与数值运算。
修复方案
只选取数值列计算zscore,或者将可转数值的列转换为数值类型后再计算:
import pandas as pd # 方法1:排除明确的非数值列,比如索引为1的列 numeric_cols = dataset.columns.drop(1) # 把选中列统一转成数值类型,不能转的自动设为NaN numeric_data = dataset[numeric_cols].apply(pd.to_numeric, errors='coerce') # 可根据需求先填充缺失值再计算zscore,这里示例直接删除全空列 Z = stats.zscore(numeric_data.dropna(axis=1, how='all'))
内容的提问来源于stack exchange,提问作者ashish_goy
相关产品推荐
相关产品推荐

