Каков наилучший способ проверки правильных dtypes в кадре данных pandas в рамках тестирования?

1

Перед предварительной обработкой и обучением модели по некоторым данным я хочу проверить, что каждая функция (каждый столбец) фрейма данных имеет правильный тип данных. т.е. если в кадре данных есть столбцы col1, col2, col3, они должны иметь типы int, float, string соответственно, как я их определил (col1 не может быть string типа, порядок имеет значение).

Каков наилучший способ сделать это, если

  1. Столбцы имеют различные типы - int, float, timestamp, string
  2. Слишком много столбцов (> 500), чтобы вручную выписать/пометить каждый тип данных столбца

Что-то вроде

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 чтобы гарантировать соответствие каждого типа столбца. Также было бы хорошо знать, какой столбец выбрасывает ошибку (возможно, более подходит для цикла по столбцам?)

Есть ли способ достичь этого, и если да, то каков наилучший способ добиться этого? Возможно, я рассматриваю проблему не так - в общем, как я могу гарантировать, что столбцы df имеют правильный тип данных, как я их определил?

Теги:
pandas
testing

1 ответ

1
Лучший ответ

Вы можете использовать pd.DataFrame.dtypes чтобы вернуть имя столбца сопоставления 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))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню