Pandas: конвертировать dtype 'object' в int

Я прочитал SQL-запрос в Pandas, и значения входят как dtype 'object', хотя это строки, даты и целые числа. Я могу преобразовать дату 'объект' в dtyetime dtyetime Pandas, но я получаю сообщение об ошибке при попытке преобразовать строку и целые числа.

Вот пример:

>>> import pandas as pd
>>> df = pd.read_sql_query('select * from my_table', conn)
>>> df
    id    date          purchase
 1  abc1  2016-05-22    1
 2  abc2  2016-05-29    0
 3  abc3  2016-05-22    2
 4  abc4  2016-05-22    0

>>> df.dtypes
 id          object
 date        object
 purchase    object
 dtype: object

Преобразование df['date'] в datetime работает:

>>> pd.to_datetime(df['date'])
 1  2016-05-22
 2  2016-05-29
 3  2016-05-22
 4  2016-05-22
 Name: date, dtype: datetime64[ns] 

Но я получаю сообщение об ошибке при попытке преобразования df['purchase'] в целое число:

>>> df['purchase'].astype(int)
 ....
 pandas/lib.pyx in pandas.lib.astype_intsafe (pandas/lib.c:16667)()
 pandas/src/util.pxd in util.set_value_at (pandas/lib.c:67540)()

 TypeError: long() argument must be a string or a number, not 'java.lang.Long'

ПРИМЕЧАНИЕ. Я получаю аналогичную ошибку, когда я пробовал .astype('float')

И при попытке конвертировать в строку ничего не происходит.

>>> df['id'].apply(str)
 1 abc1
 2 abc2
 3 abc3
 4 abc4
 Name: id, dtype: object

Ответ 1

Документирование ответа, который работал у меня на основе комментария @piRSquared.

Мне нужно сначала преобразовать в строку, затем целое число.

>>> df['purchase'].astype(str).astype(int)

Ответ 2

Выполните следующие действия:

1. очистите ваш файл → откройте ваш файл данных в формате csv и увидите, что есть "?" вместо пустых мест и удалите их все.

2. удалите строки, содержащие пропущенные значения например.:

df.dropna(subset=["normalized-losses"], axis = 0 , inplace= True)

3. используйте astype для конвертации

df["normalized-losses"]=df["normalized-losses"].astype(int)

Примечание. Если вы все еще находите ошибки в вашей программе, то еще раз проверьте файл csv, откройте его в Excel и выясните, есть ли "?" в нужном столбце, затем удалите его и сохраните файл, а затем вернитесь и запустите программу.

комментировать успех! если он работает. :)

Ответ 3

Это просто

pd.factorize(df.purchase)[0]

Пример:

labels, uniques = pd.factorize(['b', 'b', 'a', 'c', 'b'])'
labels
# array([0, 0, 1, 2, 0])
uniques
# array(['b', 'a', 'c'], dtype=object)

Ответ 4

Мои данные поезда содержат три объекта: объект после применения astype, он преобразует объект в числовой, но перед этим вам необходимо выполнить несколько шагов предварительной обработки:

train.dtypes

C12       object
C13       object
C14       Object

train['C14'] = train.C14.astype(int)

train.dtypes

C12       object
C13       object
C14       int32