Je veux définir le dtype
s de plusieurs colonnes dans pd.Dataframe
(j'ai un fichier que j'ai dû analyser manuellement dans une liste de listes, car le fichier ne pouvait pas être utilisé pd.read_csv
)
import pandas as pd
print pd.DataFrame([['a','1'],['b','2']],
dtype={'x':'object','y':'int'},
columns=['x','y'])
Je reçois
ValueError: entry not a 2- or 3- tuple
La seule façon de les définir est de parcourir chaque variable de colonne et de refondre avec astype
.
dtypes = {'x':'object','y':'int'}
mydata = pd.DataFrame([['a','1'],['b','2']],
columns=['x','y'])
for c in mydata.columns:
mydata[c] = mydata[c].astype(dtypes[c])
print mydata['y'].dtype #=> int64
Y a-t-il un meilleur moyen?
df = pd.DataFrame([['a','1'],['b','2']], dtype='int', columns=['x','y'])
"works" ... mais: sRéponses:
Depuis la 0.17, vous devez utiliser les conversions explicites:
(Comme mentionné ci-dessous, plus de "magie",
convert_objects
a été obsolète dans la version 0.17)Vous pouvez les appliquer à chaque colonne que vous souhaitez convertir:
et confirmez que le dtype est mis à jour.
ANSWER / DEPRECATED ANSWER for pandas 0.12 - 0.16: Vous pouvez utiliser
convert_objects
pour déduire de meilleurs dtypes:La magie! (Triste de le voir obsolète.)
la source
type.convert
dans R un peu; sympa mais laisse dans certains cas un souhait de spécifications explicites.convert_objects()
était obsolète ... je ne sais pas ce qui l'a remplacé?Pour ceux venant de Google (etc.) comme moi:
convert_objects
est obsolète depuis la version 0.17 - si vous l'utilisez, vous obtenez un avertissement comme celui-ci:Vous devriez faire quelque chose comme ceci:
df =
df.astype(np.float)
df["A"] =
pd.to_numeric(df["A"])
la source
pd.to_datetime, to_timedelta, to_numeric
cela devrait être la réponse acceptée.vous pouvez définir les types explicitement avec pandas
DataFrame.astype(dtype, copy=True, raise_on_error=True, **kwargs)
et passer dans un dictionnaire avec les dtypes que vous souhaitezdtype
voici un exemple:
maintenant tu peux voir que ça a changé
la source
Une autre façon de définir les types de colonnes consiste à commencer par construire un tableau d'enregistrements numpy avec les types souhaités, à le remplir, puis à le transmettre à un constructeur DataFrame.
la source
face à un problème similaire à vous. Dans mon cas, j'ai des milliers de fichiers à partir de journaux Cisco que je dois analyser manuellement.
Afin d'être flexible avec les champs et les types, j'ai testé avec succès en utilisant StringIO + read_cvs qui accepte en effet un dict pour la spécification dtype.
J'obtiens généralement chacun des fichiers (5k-20k lignes) dans un tampon et crée les dictionnaires dtype dynamiquement.
Finalement, je concatène (avec catégorique ... grâce à 0.19) ces dataframes dans une grande trame de données que je vide dans hdf5.
Quelque chose dans ce sens
Pas très pythonique ... mais fait le boulot
J'espère que ça aide.
JC
la source
Il vaut mieux utiliser np.arrays typé, puis transmettre les données et les noms de colonne sous forme de dictionnaire.
la source