Num PY ou Pandas: garder le type de tableau comme entier tout en ayant une valeur NaN

y a-t-il une façon privilégiée de conserver le type de données d'un tableau numpy fixé par int (ou int64 ou autre), tout en ayant toujours un élément à l'intérieur inscrit comme numpy.NaN ?

en particulier, je suis en train de convertir une structure de données interne en une base de données Pandas. Dans notre structure, nous avons des colonnes de type entier qui ont encore des NaN (mais le dtype de la colonne est int). On dirait qu'on refait tout en flottant si on fait une base de données, j'aime vraiment être int .

?

Choses essayé:

j'ai essayé d'utiliser la fonction from_records() sous pandas.DataFrame, avec coerce_float=False et cela n'a pas aidé. J'ai aussi essayé D'utiliser des tableaux masqués NumPy, avec Nan fill_value, qui ne fonctionnait pas non plus. Tous ces facteurs ont fait en sorte que le type de données de la colonne est devenu un flotteur.

92
demandé sur piRSquared 2012-07-18 22:30:02

4 réponses

NaN ne peut pas être stocké dans un tableau entier. C'est une limitation connue des pandas pour le moment; j'ai attendu que des progrès soient faits avec les valeurs de NA dans num Py (similaire à NAs dans R), mais il faudra au moins 6 mois à un an avant que num Py obtienne ces caractéristiques, il semble:

http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na

(Notez qu'il a été ajouté, mais comme une nouvelle fonctionnalité uniquement dans la version de développement (jusqu'à présent): http://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#optional-integer-na-support )

83
répondu Wes McKinney 2018-08-24 06:50:15

si la performance n'est pas le problème principal, vous pouvez stocker des cordes à la place.

df.col = df.col.dropna().apply(lambda x: str(int(x)) )

alors vous pouvez mélanger alors avec NaN autant que vous voulez. Si vous voulez vraiment avoir des entiers, selon votre application , vous pouvez utiliser -1 , ou 0 , ou 1234567890 , ou une autre valeur dédiée pour représenter NaN .

vous pouvez aussi dupliquer temporairement les colonnes: l'une comme vous avez, avec des flotteurs; l'autre expérimentale, avec des entiers ou des chaînes de caractères. Puis insère asserts dans chaque endroit raisonnable en vérifiant que les deux sont en harmonie. Après assez de tests, vous pouvez lâcher les flotteurs.

7
répondu osa 2014-12-08 23:40:59

ce n'est pas une solution pour tous les cas, mais le mien (coordonnées génomiques) j'ai eu recours à l'utilisation de 0 comme NaN

a3['MapInfo'] = a3['MapInfo'].fillna(0).astype(int)

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

3
répondu pufferfish 2018-01-12 13:08:53

cette capacité a été ajoutée à la dernière version bêta des pandas: http://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#optional-integer-na-support

3
répondu techvslife 2018-08-24 03:36:20