Проблема
В последнее время я работаю над некоторыми ETL проектами и на этапе трансформации столкнулся с ошибкой "AttributeError: 'float' object has no attribute 'rint'"
, в сочетании с "TypeError: loop of ufunc does not support argument 0 of type float which has no callable rint method"
.
Объяснение
Это заняло некоторое время, но стало очевидно, что, поскольку я получаю/извлекаю данные из многих источников (CSV, JSON или XML), похожие столбцы могут иметь смешанный тип данных (т.е. столбец может иметь тип данных string и int), и прежде чем я смогу перейти к этапу преобразования, мне нужно, чтобы этот столбец имел определенный тип данных, особенно если я хочу выполнить другие задачи с ним (что я и пытался сделать и постоянно сталкивался с ошибками).
Решение
Чтобы преобразовать столбец со смешанным типом данных, необходимо привести его к определенному типу данных, с которым вы собираетесь работать.
Этого можно добиться с помощью функции pandas.DataFrame.astype
, как показано ниже.
import pandas as pd
# an example of extracted data
extracted_data = pd.DataFrame({
'Brand': ['Gucci', 'Nike', 'Adidas', 'Hermes', 'Zara'],
'year_of_manufacture': [2010, 1999, '2012', 2011, '2008'], # mixed data type
'price': ['4034.203', 5000.00, '7450.17567', 3023.004, '4901.32345'] # mixed data type
})
# cast specific columns to a desired data type
cast_to_type = {
'year_of_manufacture': int,
'price': float
}
extracted_data = extracted_data.astype(cast_to_type)
# do the transfrom
extracted_data['price'] = extracted_data['price'].round(2)
print(extracted_data)
Для дальнейшего чтения
- Функция pandas.DataFrame.astype
- Другие способы приведения смешанного типа данных в списке к определенному типу данных
Обложка Фотография Вардана Папикяна на Unsplash