【问题标题】:How to clean a dataset having string values?如何清理具有字符串值的数据集?
【发布时间】:2021-09-29 18:40:29
【问题描述】:

我正在处理一个数据集,其中一列中的几个值是字符串。由于我在对数据集执行操作时遇到错误。

样本数据集:-

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

完整的数据集可以在这里找到:- https://www.kaggle.com/sid321axn/audit-data?select=trial.csv

我需要在数据集中找到缺失值和异常值。下面是我用来查找缺失值的代码:-

#Replacing zeros and 99999 with `np.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 and 17 can have zeroes then
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())

但这不会用 NaN 替换 99999

并找出异常值:-

我正在计算 zscore

import scipy.stats as stats
array = Dataset.values
Z=stats.zscore(array)

但它给了我以下错误:

- TypeError: unsupported operand type(s) for /: 'str' and 'int'

【问题讨论】:

  • 我在原始数据中没有看到任何 99999
  • 99999 手动添加到 location_id 列
  • 你是用“99999”还是99999替换的?即字符串或数字?
  • 替换为数字- 99999
  • 您想要哪些列的 z 分数? “LOCATION_ID”的 Zscore 没有意义

标签: python pandas scipy


【解决方案1】:

尽可能使用pd.to_numeric 将列转换为数值数据类型:

dff = df.replace({0: np.nan, 99999: np.nan}).apply(pd.to_numeric, errors="coerce")
zscores = (dff-dff.mean())/dff.std()

>>> zscores
   Sector_score  LOCATION_ID    PARA_A  ...  Detection_Risk  Audit_Risk  Risk
0           NaN          NaN -1.008963  ...             NaN   -0.726564   NaN
1           NaN     1.074450  0.191355  ...             NaN    1.034549   NaN
2           NaN    -0.903515  0.713232  ...             NaN    1.507377   NaN
3           NaN    -0.170935  1.496048  ...             NaN   -0.473018   NaN
4           NaN          NaN -0.356616  ...             NaN   -0.621491   NaN
5           NaN          NaN -1.035057  ...             NaN   -0.720853   NaN

注意:对于所有行具有相同值的列没有标准偏差,因此显示为 NaN。

输入df:
>>> df
   Sector_score LOCATION_ID  PARA_A  ...  Detection_Risk  Audit_Risk  Risk
0          1.99      LOHARU    0.30  ...             0.5      0.2920     0
1          1.99          31    0.76  ...             0.5      0.9088     0
2          1.99           4    0.96  ...             0.5      1.0744     1
3          1.99          14    1.26  ...             0.5      0.3808     0
4          1.99         NUH    0.55  ...             0.5      0.3288     0
5          1.99       99999    0.29  ...             0.5      0.2940     0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2021-11-03
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2017-04-25
    • 2020-03-03
    相关资源
    最近更新 更多