Я читаю данные из файла .csv на фрейм данных Pandas, как показано ниже. Для одного из столбцов, а именно id
, я хочу указать тип столбца как int
. Проблема в том, что в id
серии отсутствуют / пустые значения.
Когда я пытаюсь привести id
столбец к целому числу при чтении .csv, я получаю:
df= pd.read_csv("data.csv", dtype={'id': int})
error: Integer column has NA values
В качестве альтернативы я попытался преобразовать тип столбца после прочтения, как показано ниже, но на этот раз я получаю:
df= pd.read_csv("data.csv")
df[['id']] = df[['id']].astype(int)
error: Cannot convert NA to integer
Как я могу решить это?
Ответы:
Отсутствие числа NaN в целочисленных столбцах является пандой "гоча" .
Обычный обходной путь - просто использовать поплавки.
источник
df = df.astype(pd.Int32Dtype())
(для преобразования всего dataFrame или)df['col'] = df['col'].astype(pd.Int32Dtype())
. Другие принятые обнуляемых целочисленные типы являютсяpd.Int16Dtype
иpd.Int64Dtype
. Выбрать свой яд.В версии 0.24. + Pandas получила возможность хранить целочисленные dtypes с пропущенными значениями.
Обнуляемый целочисленный тип данных .
Панды могут представлять целочисленные данные с возможно отсутствующими значениями, используя
arrays.IntegerArray
. Это расширение типов, реализованное в пандах. Это не dtype по умолчанию для целых чисел, и не будет выведено; Вы должны явно передать dtype вarray()
илиSeries
:Для преобразования столбца в обнуляемые целые числа используйте:
источник
"Int64"
а не"int64"
(первое «i» должно бытьdf.myCol = df.myCol.astype('Int64')
илиdf['myCol'] = df['myCol'].astype('Int64')
Мой сценарий использования - данные перед загрузкой в таблицу БД:
Удалите NaN, преобразуйте в int, преобразуйте в str, а затем снова вставьте NAN.
Это не красиво, но это делает работу!
источник
Теперь можно создать столбец панд, содержащий NaNs как dtype
int
, поскольку теперь он официально добавлен в панды 0.24.0.Замечания к выпуску pandas 0.24.x Цитата: «У Pandas появилась возможность хранить целочисленные dtypes с пропущенными значениями
источник
Если вы абсолютно хотите объединить целые и NaN в столбце, вы можете использовать тип данных 'object':
Это заменит NaN целым числом (неважно, какое), преобразует в int, преобразует в объект и, наконец, вставляет NaN.
источник
Если вы можете изменить свои сохраненные данные, используйте значение часового поля для отсутствия
id
. Обычный вариант использования, определяемый по имени столбца,id
представляющий собой целое число, строго превышающее ноль, можно использовать0
в качестве значения часового значения, чтобы вы могли написатьисточник
Вы можете использовать,
.dropna()
если это нормально, чтобы удалить строки со значениями NaN.Либо используйте
.fillna()
и.astype()
для замены NaN значениями и преобразуйте их в int.Я столкнулся с этой проблемой при обработке файла CSV с большими целыми числами, хотя некоторые из них отсутствовали (NaN). Использование float в качестве типа не было возможным, потому что я мог потерять точность.
Моим решением было использовать str в качестве промежуточного типа . Затем вы можете преобразовать строку в int, как вам будет угодно позже в коде. Я заменил NaN на 0, но вы можете выбрать любое значение.
Для иллюстрации, вот пример того, как поплавки могут потерять точность:
И вывод:
источник
Большинство решений здесь говорят вам, как использовать целое число заполнителя для представления нулей. Такой подход не поможет, если вы не уверены, что целое число не будет отображаться в ваших исходных данных. Мой метод с форматирует поплавки без их десятичных значений и конвертирует нули в None. Результатом является объектный тип данных, который при загрузке в CSV будет выглядеть как целочисленное поле с нулевыми значениями.
источник
Я столкнулся с этой проблемой, работая с pyspark. Поскольку это интерфейс Python для кода, работающего на jvm, он требует безопасности типов и использование float вместо int не вариант. Я обошел эту проблему, обернув панды
pd.read_csv
в функцию, которая будет заполнять пользовательские столбцы пользовательскими значениями заполнения, прежде чем привести их к требуемому типу. Вот что я в итоге использовал:источник
источник
edit
добавить дополнительную информацию и / или дополнить свои пояснения исходной документацией.Сначала удалите строки, которые содержат NaN. Затем выполните целочисленное преобразование оставшихся строк. Наконец, вставьте удаленные строки снова. Надеюсь, это сработает
источник
Предполагая, что ваш DateColumn в формате 3312018.0 должен быть преобразован в 31.03.2008 в виде строки. И некоторые записи отсутствуют или 0.
источник