作为测试的一部分,在pandas数据帧中检查正确dtypes的最佳方法是什么?

时间:2018-06-14 08:59:00

标签: python pandas testing

在对某些数据进行预处理和训练模型之前,我想检查数据帧的每个特征(每列)是否具有正确的数据类型。即,如果数据框有列col1col2col3,则它们应分别具有类型intfloatstring,因为我已定义他们(col1不能属于string,订单很重要。

如果

,最好的方法是什么?
  1. 列有各种类型 - int,float,timestamp,string
  2. 有太多列(> 500)手动写出/标记每个列数据类型
  3. 这样的东西
    types = df.dtypes # returns a pandas series
    if types != correct_types:
        raise TypeError("Some of the columns do not have the correct type")
    

    其中correct_types是每列的已知数据类型 - 这些类型必须与types的顺序相同,以确保每个列类型都正确匹配。知道哪一列抛出错误也是一件好事(所以也许在列上使用for循环更合适?)

    有没有办法实现这一目标,如果是这样,实现这一目标的最佳方法是什么?也许我正在以错误的方式查看问题 - 更一般地说,我如何确保df的列具有正确的数据类型?

1 个答案:

答案 0 :(得分:1)

您可以使用pd.DataFrame.dtypes将系列映射列名称返回到数据类型:

df = pd.DataFrame([[1, True, 'dsfasd', 51.314],
                   [51, False, '56345', 56.1234]],
                  columns=['col1', 'col2', 'col3', 'col4'])

res = df.dtypes

print(res)

col1      int64
col2       bool
col3     object
col4    float64
dtype: object

本系列的值为dtype个对象:

print(res.iloc[0])

dtype('int64')

作为一个系列,您可以按索引或按值进行过滤。例如,要过滤int64类型:

print(res[res == np.dtype('int64')])

col1    int64
dtype: object

您还可以通过series1 == series2将系列与另一系列进行比较,以创建布尔系列映射。用自己检查系列的一个简单示例:

# in reality, you will check res versus a custom series_valid
print(res == res)

col1    True
col2    True
col3    True
col4    True
dtype: bool

如果您的比较中的任何值为False,则可能会出现错误:

if (res != series_valid).any():
    indices = (res != series_valid).index.tolist()
    raise TypeError("Some columns have incorrect type: {0}".format(indices))