Numpy数据类型转换astype报错

一、复现bug

程序执行到这一步

tmp = np.loadtxt("Day1.TCP.arff.csv", dtype=np.str, delimiter=",") # 读取csv文件
data = tmp[1:, :-1].astype(np.int)  # str -> int

报错:
ValueError: invalid literal for int() with base 10: '1740.5'

再运行这一步

data2 = tmp[1:, :-1].astype(np.float)  # str -> float

报错:
could not convert string to float: '?'

二、原因

csv文件里,我们期望的数据是这样的
[[4 3 3 1 0 3]
[1 1 4 0 2 1]
[2 2 4 1 4 3]
[0 4 0 2 0 2]
[0 2 0 3 3 4]
[1 0 2 1 0 0]
[4 3 1 1 0 3]]
但实际上可能是这样的
[[4 3 3 1 0 3]
[1 1 4 0 2 1]
[2 2 4 1 ‘#’ 3]
[0 4 0 2 0 2]
[0 2 0 3 ‘?’ 4]
[1 0 2 1 0 0]
[4 3 1 1 0 ?]]
因此在转换的时候,就会出现错误

三、解决方案

改用pandas,并利用自定义函数实现转换数据类型,对有问题的字符进行特殊处理
以下是自定义转换函数:

import numpy as np
def convert_currency(value):
    """
    转换字符为float类型
    如果转换失败,返回0
    """
    try:
        return np.float(value)
    except Exception:
        return 0

使用我们自己定义的函数转换字符

pd_data = pd.read_csv('Day1.TCP.arff.csv')
pd_data['age'].apply(convert_currency)  # pd_data['age'] 对应年龄一列

参考链接: https://zhuanlan.zhihu.com/p/35287822

你可能感兴趣的:(开发,python)