Attribuer des pandas dataframe colonne dtypes
Je veux mettre le dtype
s de plusieurs colonnes dans pd.Dataframe
(j'ai un fichier que j'ai eu à analyser manuellement dans une liste de listes, comme le fichier n'a pas été facile pour le pd.read_csv
)
import pandas as pd
print pd.DataFrame([['a','1'],['b','2']],
dtype={'x':'object','y':'int'},
columns=['x','y'])
- Je obtenir
ValueError: entry not a 2- or 3- tuple
La seule façon que je peux le mettre en boucle dans chaque colonne de la variable et de refonte 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
Est-il un meilleur moyen?
- Ce serait peut-être une bonne bug / feature request, actuellement, je ne suis pas sûr de ce que dtype arg est en train de faire (vous pouvez la passer un scalaire, mais ce n'est pas stricte)...
- FYI:
df = pd.DataFrame([['a','1'],['b','2']], dtype='int', columns=['x','y'])
"œuvres"... mais :s - Ouais, les "œuvres" en effet; de façon imprévisible...
- Cette GitHub problème peut vite devenir pertinentes: github.com/pydata/pandas/issues/9287
Vous devez vous connecter pour publier un commentaire.
Depuis 0.17, vous devez utiliser les conversions explicites:
(Comme mentionné ci-dessous, plus de "magie",
convert_objects
a été déprécié à hauteur de 0,17)Vous pouvez les appliquer pour chaque colonne que vous voulez convertir:
et de confirmer la dtype est mis à jour.
VIEUX et OBSOLÈTE RÉPONSE pour les pandas 0.12 - 0.16: Vous pouvez utiliser
convert_objects
à déduire mieux dtypes:De la magie! (C'est triste à voir obsolète.)
type.convert
dans R un peu; nice, mais ne laissez celui qui souhaite explicite spécifications dans certains cas.convert_objects()
a été abandonné... je ne suis pas sûr de ce qui l'a remplacé?convert_objects
a été abandonné depuis 0.17 (2017) en faveur d'un type de données spécifique convertisseurspd.to_datetime, to_timedelta, to_numeric
Pour ceux qui viennent de Google (etc.) comme moi:
convert_objects
a été abandonné depuis 0.17 - si vous l'utilisez, vous obtenez un avertissement comme celui-ci:Vous devriez faire quelque chose comme ce qui suit:
df =
df.astype(np.float)
df["A"] =
mp.to_numeric(df["A"])
pd.to_datetime, to_timedelta, to_numeric
ce doit être la accepté de répondre.vous pouvez définir les types explicitement avec les pandas
DataFrame.astype(dtype, copy=True, raise_on_error=True, **kwargs)
et passer dans un dictionnaire avec le dtypes vous voulezdtype
voici un exemple:
maintenant, vous pouvez voir qu'il a changé
Une autre façon de définir les types de colonne est d'abord de construire un numpy tableau d'enregistrements de vos types, de la remplir et de le passer à un DataFrame constructeur.
face à des problèmes similaires à vous. Dans mon cas, j'ai plus de 1000 fichiers de cisco journaux que j'ai besoin d'analyser manuellement.
Pour être flexible avec les champs et les types que j'ai testé avec succès à l'aide de StringIO + read_cvs qui, en effet, que d'accepter un dict pour le dtype spécification.
J'ai l'habitude de les obtenir chacun des fichiers ( 5k-20k lignes) dans une mémoire tampon et de créer de la dtype dynamiquement des dictionnaires.
Finalement, j'ai concaténer ( avec catégorique... grâce à 0,19) ces dataframes dans un grand bloc de données que je dump dans le hdf5.
Quelque chose le long de ces lignes de
Pas très pythonic.... mais fait le travail
Espère que cela aide.
JC
Vous êtes mieux d'utiliser tapé np.des tableaux, puis transmettre les données et les noms de colonnes comme un dictionnaire.