web-dev-qa-db-fra.com

Pandas: convertit le type d'objet 'en int

J'ai lu une requête SQL dans Pandas et les valeurs entrent sous la forme dtype 'object', bien qu'il s'agisse de chaînes, de dates et de nombres entiers. Je peux convertir l'objet 'date' en un type de type datetime Pandas, mais je reçois une erreur lorsque je tente de convertir la chaîne et les entiers.

Voici un exemple:

>>> 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

La conversion du df['date'] en un datetime fonctionne:

>>> 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] 

Mais j'obtiens une erreur en essayant de convertir le df['purchase'] en un entier:

>>> 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'

NOTE: Je reçois une erreur similaire lorsque j'ai essayé .astype('float')

Et en essayant de convertir en chaîne, rien ne semble se passer.

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

Documenter la réponse qui a fonctionné pour moi sur la base du commentaire de @piRSquared.

Je devais d'abord convertir une chaîne, puis un entier.

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

Suivez ces étapes:

1. nettoyez votre fichier -> ouvrez votre fichier de données au format csv et voyez qu'il y a "?" à la place des espaces vides et supprimez-les tous.

2.drop les lignes contenant les valeurs manquantes, par exemple:

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

3.utiliser astype maintenant pour la conversion

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

Remarque: Si vous trouvez toujours des erreurs dans votre programme, inspectez à nouveau votre fichier csv, ouvrez-le dans Excel pour rechercher s’il existe un "?" dans la colonne requise, supprimez-le, enregistrez le fichier, puis exécutez votre programme.

commentaire succès! si ça marche. :)

2
mandeep

C'est simple

pd.factorize(df.purchase)[0]

Exemple:

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

Les données de mon train contiennent trois caractéristiques: objet après application astype il convertit l'objet en numérique, mais avant cela, vous devez effectuer certaines étapes de prétraitement:

train.dtypes

C12       object
C13       object
C14       Object

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

train.dtypes

C12       object
C13       object
C14       int32
0
HEMANTHKUMAR GADI