Vous avez quatre options principales pour convertir les types en pandas:
lisez la suite pour des explications plus détaillées et l’utilisation de chacune de ces méthodes.
Le meilleur moyen de convertir une ou plusieurs colonnes d’un DataFrame de valeurs numériques est d’utiliser pandas.to_numeric()
.
Cette fonction essaiera de changer les objets non numériques (tels que les chaînes) en entiers ou en nombres à virgule flottante selon le cas.
utilisation de Base
L’entrée de to_numeric()
est une Série ou une seule colonne d’un DataFrame.,
Comme vous pouvez le voir, une nouvelle Série est retourné. N’oubliez pas d’affecter cette sortie à un nom de variable ou de colonne pour continuer à l’utiliser:
# convert Seriesmy_series = pd.to_numeric(my_series)# convert column "a" of a DataFramedf = pd.to_numeric(df)
Vous pouvez également l’utiliser pour convertir plusieurs colonnes d’une trame de données via la apply()
méthode:
tant que vos valeurs peuvent toutes être converties, c’est probablement
gestion des Erreurs
Mais si certaines valeurs ne peuvent pas être convertis à un type numérique?,
to_numeric()
prend également un argument de mot-clé errors
qui vous permet de forcer les valeurs non numériques à être NaN
, ou simplement ignorer les colonnes contenant ces valeurs.
Voici un exemple utilisant une série de chaîness
qui a l’objet dtype:
>>> s = pd.Series()>>> s0 11 22 4.73 pandas4 10dtype: object
le comportement par défaut est de lever s’il ne peut pas convertir une valeur., Dans ce cas, il ne peut pas faire face à la chaîne ‘pandas’:
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')ValueError: Unable to parse string
plutôt que d’échouer, nous pourrions vouloir que ‘pandas’ soit considéré comme une valeur numérique manquante/mauvaise., Nous pouvons contraindre les valeurs invalides à NaN
comme suit en utilisant l’argument de mot-clé errors
:
>>> pd.to_numeric(s, errors='coerce')0 1.01 2.02 4.73 NaN4 10.0dtype: float64
la troisième option pour errors
consiste simplement à ignorer l’opération si une valeur invalide est rencontré:
>>> pd.to_numeric(s, errors='ignore')# the original Series is returned untouched
cette dernière option est particulièrement utile lorsque vous souhaitez convertir toute votre trame de données, mais que vous ne savez pas laquelle de nos colonnes peut être convertie de manière fiable en un type numérique., Dans ce cas, écrivez simplement:
df.apply(pd.to_numeric, errors='ignore')
la fonction sera appliquée à chaque colonne de la trame de données. Les colonnes qui peuvent être converties en un type numérique seront converties, tandis que les colonnes qui ne le peuvent pas (par exemple, elles contiennent des chaînes ou des dates non numériques) seront laissées seules.
Passer
Par défaut, la conversion avec des to_numeric()
vous donnera soit un int64
ou float64
dtype (ou quel que soit entier de la largeur natif sur votre plate-forme).,
c’est généralement ce que vous voulez, Mais Que faire si vous vouliez économiser de la mémoire et utiliser un dtype plus compact, comme float32
, ou int8
?
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
Downcasting à ‘integer’ utilise le plus petit entier possible qui peut contenir les valeurs:
>>> pd.to_numeric(s, downcast='integer')0 11 22 -7dtype: int8
Downcasting à ‘float’ choisit de même un type flottant plus petit que la normale:
>>> pd.to_numeric(s, downcast='float')0 1.01 2.02 -7.0dtype: float32
astype()
la méthode astype()
vous permet d’être explicite sur le dtype que vous souhaitez que votre dataframe ou votre série ait., Il est très polyvalent en ce sens que vous pouvez essayer d’aller d’un type à l’autre.
utilisation de base
appelez la méthode sur l’objet que vous souhaitez convertir etastype()
essaiera de la Convertir pour vous:
notez que j’ai dit « try » – siastype()
ne sait pas comment convertir une valeur dans la série ou la trame de données, Par exemple, si vous avez un NaN
ou inf
valeur, vous obtiendrez une erreur en essayant de le convertir en un nombre entier.
à partir de pandas 0.20.,0, cette erreur peut être supprimée en passant errors='ignore'
. Votre objet d’origine sera retourné intact.
attention
astype()
est puissant, mais il peut convertir des valeurs en « mal ». Par exemple:
>>> s = pd.Series()>>> s0 11 22 -7dtype: int64
Ce sont de petits entiers, alors que diriez-vous de convertir en un type 8 bits non signé pour économiser de la mémoire?
>>> s.astype(np.uint8)0 11 22 249dtype: uint8
la conversion a fonctionné, mais le -7 a été enveloppé pour devenir 249 (c’est – à-dire 28-7)!
essayer de downcast en utilisantpd.to_numeric(s, downcast='unsigned')
à la place pourrait aider à éviter cette erreur.,
infer_objects ()
la Version 0.21.0 de pandas a introduit la méthodeinfer_objects()
pour convertir les colonnes d’une trame de données qui ont un type de données d’objet en un type plus spécifique (conversions souples).
par exemple, voici un DataFrame avec deux colonnes de type objet. L’un contient des entiers réels et l’autre des chaînes représentant des entiers:
>>> df = pd.DataFrame({'a': , 'b': }, dtype='object')>>> df.dtypesa objectb objectdtype: object
En utilisant infer_objects()
, vous pouvez changer le type de colonne ‘a’ en int64:
>>> df = df.infer_objects()>>> df.dtypesa int64b objectdtype: object
la colonne ‘b’ a été laissée seule car ses valeurs étaient des., Si vous vouliez essayer de forcer la conversion des deux colonnes en un type entier, vous pouvez utiliser df.astype(int)
à la place.
convert_dtypes ()
la Version 1.0 et supérieure inclut une méthodeconvert_dtypes()
pour convertir les colonnes de séries et de trames de données au meilleur type possible qui prend en charge la valeur manquantepd.NA
.
ici « best possible » signifie le type le plus adapté pour contenir les valeurs., Par exemple, il s’agit d’un type entier pandas si toutes les valeurs sont des entiers (ou des valeurs manquantes): une colonne Objet D’objets entiers Python est convertie en Int64
, une colonne de NumPy int32
les valeurs deviendront le dtype pandas Int32
.,
avec notre object
DataFrame df
, nous obtenons le résultat suivant:
>>> df.convert_dtypes().dtypes a Int64b stringdtype: object
puisque la colonne ‘a’ contenait des valeurs entières, elle a été convertie en Int64
type (qui est capable de contenir des valeurs manquantes, contrairement à int64
).
la colonne ‘b’ contenait des objets string, elle a donc été changée en pandas’string
dtype.
par défaut, cette méthode déduit le type des valeurs d’objet dans chaque colonne., Nous pouvons changer cela en passant infer_objects=False
:
>>> df.convert_dtypes(infer_objects=False).dtypes a objectb stringdtype: object
maintenant, la colonne ‘a’ est restée une colonne Objet: pandas sait qu’elle peut être décrite comme une colonne ‘integer’ (en interne, elle a exécuté infer_dtype
) mais n’a pas déduit exactement quel type convertissez-le. La colonne ‘ b ‘A de nouveau été convertie en dtype’ string ‘car elle était reconnue comme contenant des valeurs’ string’.