220 votes

NumPy ou Pandas : Conserver le type de tableau en tant qu'entier tout en ayant une valeur NaN

Existe-t-il une méthode préférée pour conserver le type de données d'un fichier numpy fixé comme int (ou int64 ou autre), tout en ayant un élément à l'intérieur répertorié comme numpy.NaN ?

En particulier, je suis en train de convertir une structure de données interne en DataFrame Pandas. Dans notre structure, nous avons des colonnes de type entier qui ont toujours des NaN (mais le dtype de la colonne est int). Il semble que tout soit refondu en float si nous transformons cette structure en DataFrame, mais nous aimerions vraiment être en mesure de le faire. int .

Réflexions ?

Choses essayées :

J'ai essayé d'utiliser le from_records() sous pandas.DataFrame, avec la fonction coerce_float=False et cela n'a pas aidé. J'ai également essayé d'utiliser des tableaux masqués NumPy, avec une valeur de remplissage NaN, ce qui n'a pas fonctionné non plus. Toutes ces tentatives ont eu pour effet de transformer le type de données de la colonne en un flottant.

7voto

jpp Points 83462

Pandas v0.24+

Fonctionnalité à soutenir NaN dans la série des entiers sera disponible à partir de la v0.24. Il y a des informations sur cette dans la section "Quoi de neuf" de la v0.24, et plus de détails dans la section Type de données d'un entier annulable .

Pandas v0.23 et antérieures

En général, il est préférable de travailler avec float dans la mesure du possible, même lorsque la série est extraite de int a float en raison de l'inclusion de NaN valeurs. Cela permet d'effectuer des calculs vectorisés basés sur NumPy là où, autrement, des boucles de niveau Python seraient traitées.

Les documents font suggérer : "Une possibilité est d'utiliser dtype=object à la place". Par exemple :

s = pd.Series([1, 2, 3, np.nan])

print(s.astype(object))

0      1
1      2
2      3
3    NaN
dtype: object

Pour des raisons esthétiques, par exemple pour l'édition d'un fichier, cette fonction peut être utilisée. peut de préférence.

Pandas v0.23 et antérieures : arrière-plan

NaN est considéré comme un float . Les docs actuellement (à partir de la v0.23) spécifier la raison pour laquelle les séries entières sont actualisées en float :

En l'absence d'un support NA performant intégré à NumPy dès le départ, la principale victime est la capacité à représenter les NA dans des tableaux d'entiers.

Ce compromis est fait en grande partie pour des raisons de mémoire et de performance, et et aussi pour que la série qui en résulte reste "numérique".

Les documents fournir des règles pour l'upcasting en raison de NaN l'inclusion :

Typeclass   Promotion dtype for storing NAs
floating    no change
object      no change
integer     cast to float64
boolean     cast to object

3voto

Chananel P Points 617

Nouveautés pour Pandas v1.00 +

Vous n'utilisez pas (et ne pouvez pas utiliser) numpy.nan plus. Maintenant, vous avez pandas.NA .

A lire : https://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html

IntegerArray est actuellement expérimental. Son API ou son implémentation peuvent changer sans avertissement.

Modifié dans la version 1.0.0 : Utilise maintenant pandas.NA comme valeur manquante plutôt que numpy.nan.

Dans Travailler avec des données manquantes, nous avons vu que pandas utilise principalement NaN pour représenter les données manquantes. Comme NaN est un flottant, cela oblige un tableau d'entiers avec des valeurs manquantes à devenir en virgule flottante. Dans certains Dans certains cas, cela n'a pas beaucoup d'importance. Mais si votre colonne d'entiers est, disons, un identificateur, le passage à la virgule flottante peut s'avérer problématique. Certains entiers ne peuvent même pas être représentés sous forme de nombres à virgule flottante.

2voto

Kynrek Points 1219

S'il y a des blancs dans les données textuelles, les colonnes qui seraient normalement des entiers seront converties en flottants avec le type float64, car le type int64 ne peut pas gérer les zéros. Cela peut entraîner des incohérences dans les schémas si vous chargez plusieurs fichiers dont certains contiennent des blancs (qui seront convertis en float64) et d'autres qui n'en contiennent pas (qui seront convertis en int64).

Ce code tentera de convertir toutes les colonnes de type numérique en Int64 (par opposition à int64), puisque Int64 peut gérer les zéros.

import pandas as pd
import numpy as np

#show datatypes before transformation
mydf.dtypes

for c in mydf.select_dtypes(np.number).columns:
    try:
        mydf[c] = mydf[c].astype('Int64')
        print('casted {} as Int64'.format(c))
    except:
        print('could not cast {} to Int64'.format(c))

#show datatypes after transformation
mydf.dtypes

1voto

mork Points 56

C'est maintenant possible, depuis pandas v 0.24.0

pandas 0.24.x release notes Citation : " Pandas a acquis la capacité de contenir des dtypes d'entiers avec des valeurs manquantes.

0voto

irdb Points 11

Je sais que l'OP a demandé NumPy ou Pandas uniquement, mais je pense que cela vaut la peine d'être mentionné. polaires en tant qu'alternative prenant en charge la fonctionnalité demandée.

En Polars les valeurs manquantes dans une colonne de nombres entiers sont simplement null et la colonne reste une colonne d'entiers.

Voir Polars - Guide de l'utilisateur > Venant de Pandas pour plus d'informations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X