数据字段中的混合数据类型

时间:2019-01-10 04:38:18

标签: python string pandas numpy dataframe

我正在编写一个旨在检测索引并报告在非常大的数据集中发现的错误的代码。我正在使用csv读取数据集(pandas),创建具有数十列的dataframe。通过将感兴趣的列转换为np数组,并使用基本逻辑表达式和np.where函数,可以轻松实现数值错误。巴姆!

我要寻找的错误之一是

  

无效的数据类型

例如,如果该列应该是一个浮点数数组,但是在所有浮点数的中间无意中输入了一个字符串smack dab。转换为np数组时,然后将所有值转换为字符串并导致逻辑表达式失败(如预期)。

理想情况下,该数据列的所有非数字条目都将被索引为

  

无效的数据类型

记录值。然后,它将用NaN替换该值,将字符串数组转换为最初打算的浮点值,然后继续进行数字错误检查的评估。

这可以通过使用一些try / catch语句的for循环来简单解决。但是对python来说是新手。我希望有一个更优雅的解决方案。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

看看great expectatoins,它旨在解决类似的问题。请注意,在它们实现expect_column_values_to_be_parseable_as_type之前,您可以强制将column设置为字符串,并使用正则表达式进行检查。例如,假设您有一个名为'AGE'的列,并想将其验证为18到120之间的整数

import great_expectations as ge

gf = ge.read_csv("my_datacsv",
                 dtype={
                     'AGE':str,
                 })

result = gf.expect_column_values_to_match_regex('AGE',
                                                r'1[8-9]|[2-9][0-9]',
                                                result_format={'result_format': 'COMPLETE'})

或者,使用numpy可能是这样的:

import numpy as np

@np.vectorize
def is_num(num):
    try:
        float(num)
        return True
    except:
        return False

A = np.array([1,2,34,'e',5])
is_num(A)

返回

array([ True,  True,  True, False,  True])