Перед предварительной обработкой и обучением модели по некоторым данным я хочу проверить, что каждая функция (каждый столбец) фрейма данных имеет правильный тип данных. т.е. если в кадре данных есть столбцы col1
, col2
, col3
, они должны иметь типы int
, float
, string
соответственно, как я их определил (col1
не может быть string
типа, порядок имеет значение).
Каков наилучший способ сделать это, если
Что-то вроде
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
имеют правильный тип данных, как я их определил?
Вы можете использовать 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))