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
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)
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. :)
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)
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