Existe-t-il un moyen préféré de conserver le type de données d'un numpy
tableau fixe comme int
(ou int64
ou autre), tout en ayant un élément à l'intérieur répertorié comme numpy.NaN
?
En particulier, je convertis une structure de données interne en un Pandas DataFrame. 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 tout refondre en flottant si nous en faisons un DataFrame, mais nous aimerions vraiment l'être int
.
Pensées?
Choses essayées:
J'ai essayé d'utiliser la from_records()
fonction sous pandas.DataFrame, avec coerce_float=False
et cela n'a pas aidé. J'ai également essayé d'utiliser des tableaux masqués NumPy, avec NaN fill_value, qui ne fonctionnaient pas non plus. Tous ces éléments ont fait du type de données de colonne un flottant.
from_records
fonction sous pandas.DataFrame, aveccoerce_float=False
, mais pas de chance ... cela donne toujours du type aux nouvelles donnéesfloat64
.Réponses:
Cette fonctionnalité a été ajoutée aux pandas (à partir de la version 0.24): https://pandas.pydata.org/pandas-docs/version/0.24/whatsnew/v0.24.0.html#optional-integer-na-support
À ce stade, il nécessite l'utilisation de l'extension dtype Int64 (en majuscule), plutôt que du dtype par défaut int64 (en minuscules).
la source
'Int64'
pour le faire fonctionner. Ce sera encore mieux quand il sera activé par défaut.'Int64'
ou y a-t-il quelque chose comme'Int8'
? Il utilise une quantité insensée de mémoire par rapport ànp.float
.'Int8'
semble fonctionner, maisnp.float
semble toujours se charger beaucoup plus rapidement. Le problème semble être qu'il ne libère pas de mémoire entre les deux. Supposons que le ramasse-miettes finira par s'exécuter.NaN
ne peut pas être stocké dans un tableau d'entiers. Il s'agit d'une limitation connue des pandas pour le moment; J'attendais que des progrès soient réalisés avec les valeurs NA dans NumPy (similaires aux NA dans R), mais il faudra au moins 6 mois à un an avant que NumPy n'obtienne ces fonctionnalités, il semble:http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na
(Cette fonctionnalité a été ajoutée à partir de la version 0.24 de pandas, mais notez qu'elle nécessite l'utilisation de l'extension dtype Int64 (en majuscule), plutôt que le dtype par défaut int64 (en minuscules): https://pandas.pydata.org/pandas- docs / version / 0.24 / whatsnew / v0.24.0.html # optional-integer-na-support )
la source
Si les performances ne sont pas le problème principal, vous pouvez stocker des chaînes à la place.
Ensuite, vous pouvez mélanger
NaN
autant que vous le souhaitez. Si vous voulez vraiment avoir des entiers, en fonction de votre application, vous pouvez utiliser-1
, ou0
, ou1234567890
, ou une autre valeur dédiée à représenterNaN
.Vous pouvez également dupliquer temporairement les colonnes: une comme vous l'avez, avec des flottants; l'autre expérimental, avec des entiers ou des chaînes. Insère ensuite
asserts
à chaque endroit raisonnable en vérifiant que les deux sont synchronisés. Après suffisamment de tests, vous pouvez lâcher les flotteurs.la source
Ce n'est pas une solution pour tous les cas, mais le mien (coordonnées génomiques) j'ai eu recours à 0 comme NaN
Cela permet au moins d'utiliser le type de colonne `` natif '' approprié, des opérations telles que la soustraction, la comparaison, etc. fonctionnent comme prévu
la source
Pandas v0.24 +
Les fonctionnalités à prendre
NaN
en charge dans les séries d'entiers seront disponibles dans la version v0.24 à la hausse. Il y a des informations à ce sujet dans la section v0.24 "Quoi de neuf", et plus de détails sous Type de données entier nul .Pandas v0.23 et versions antérieures
En général, il est préférable de travailler avec des
float
séries lorsque cela est possible, même lorsque la série est remontée deint
à enfloat
raison de l'inclusion deNaN
valeurs. Cela permet des calculs vectorisés basés sur NumPy où, sinon, les boucles de niveau Python seraient traitées.La documentation suggère : "Une possibilité est d'utiliser des
dtype=object
tableaux à la place." Par exemple:Pour des raisons esthétiques, par exemple la sortie dans un fichier, cela peut être préférable.
Pandas v0.23 et versions antérieures: contexte
NaN
est considéré comme unfloat
. Les documents actuellement (à partir de la v0.23) spécifient la raison pour laquelle les séries d'entiers sont remontées versfloat
:Les documents fournissent également des règles pour la remontée en raison de l'
NaN
inclusion:la source
C'est désormais possible, puisque pandas v 0.24.0
notes de publication de pandas 0.24.x Citation: " Pandas a acquis la capacité de contenir des dtypes entiers avec des valeurs manquantes.
la source
Je voulais juste ajouter que dans le cas où vous essayez de convertir un vecteur float (1.143) en entier (1) dont NA convertit en le nouveau dtype 'Int64', vous obtiendrez une erreur. Pour résoudre ce problème, vous devez arrondir les nombres puis faire ".astype ('Int64')"
Mon cas d'utilisation est que j'ai une série flottante que je veux arrondir à int, mais lorsque vous faites .round () un '* .0' à la fin du nombre reste, vous pouvez donc supprimer ce 0 de la fin en conversion en int.
la source
S'il y a des blancs dans les données texte, les colonnes qui seraient normalement des entiers seront converties en flottants en dtype float64 car int64 dtype ne peut pas gérer les valeurs NULL. Cela peut entraîner un schéma incohérent si vous chargez plusieurs fichiers certains avec des espaces (qui finiront par float64 et d'autres sans lesquels finiront par int64
Ce code tentera de convertir toutes les colonnes de type numérique en Int64 (par opposition à int64) car Int64 peut gérer les valeurs NULL
la source