J'ai un DataFrame avec de nombreuses valeurs manquantes dans les colonnes que je souhaite regrouper:
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': ['1', '2', '3'], 'b': ['4', np.NaN, '6']})
In [4]: df.groupby('b').groups
Out[4]: {'4': [0], '6': [2]}
voir que Pandas a supprimé les lignes avec des valeurs cibles NaN. (Je veux inclure ces lignes!)
Comme j'ai besoin de nombreuses opérations de ce type (de nombreux cols ont des valeurs manquantes) et que j'utilise des fonctions plus compliquées que de simples médianes (généralement des forêts aléatoires), je veux éviter d'écrire des morceaux de code trop compliqués.
Aucune suggestion? Dois-je écrire une fonction pour cela ou existe-t-il une solution simple?
dropna=False
dansgroupby()
pour obtenir le résultat souhaité. En savoir plusRéponses:
Ceci est mentionné dans la section Données manquantes de la documentation :
Une solution de contournement consiste à utiliser un espace réservé avant d'effectuer le groupby (par exemple -1):
Cela dit, cela semble assez horrible hack ... peut-être qu'il devrait y avoir une option pour inclure NaN dans groupby (voir ce problème github - qui utilise le même hack d'espace réservé).
la source
Sujet ancien, si quelqu'un trébuche encore dessus - une autre solution de contournement consiste à convertir via .astype (str) en chaîne avant le regroupement. Cela conservera les NaN.
la source
sum
ofa
est une concaténation de chaînes ici, pas une somme numérique. Cela "fonctionne" uniquement parce que 'b' se composait d'entrées distinctes. Vous avez besoin de 'a' pour être numérique et 'b' pour être une chaînepandas> = 1,1
Depuis pandas 1.1 vous avez un meilleur contrôle sur ce comportement, les valeurs NA sont désormais autorisées dans le groupeur en utilisant
dropna=False
:la source
Je ne peux pas ajouter de commentaire à M. Kiewisch car je n'ai pas assez de points de réputation (en ai seulement 41 mais il en faut plus de 50 pour commenter).
Quoi qu'il en soit, je tiens simplement à souligner que la solution de M. Kiewisch ne fonctionne pas telle quelle et peut nécessiter davantage de modifications. Considérez par exemple
ce qui montre que pour le groupe b = 4.0, la valeur correspondante est 15 au lieu de 6. Ici, il concatène simplement 1 et 5 sous forme de chaînes au lieu de l'ajouter sous forme de nombres.
la source
b
colonneUn petit point à la solution d'Andy Hayden - cela ne fonctionne pas (plus?) Parce que
np.nan == np.nan
cèdeFalse
, donc lareplace
fonction ne fait rien.Ce qui a fonctionné pour moi, c'est ceci:
(Du moins c'est le comportement de Pandas 0.19.2. Désolé de l'ajouter comme réponse différente, je n'ai pas assez de réputation pour commenter.)
la source
df['b'].fillna(-1)
.Toutes les réponses fournies jusqu'à présent entraînent un comportement potentiellement dangereux car il est tout à fait possible que vous sélectionniez une valeur fictive qui fait en fait partie de l'ensemble de données. Cela est de plus en plus probable lorsque vous créez des groupes avec de nombreux attributs. En termes simples, l'approche ne se généralise pas toujours bien.
Une solution moins hacky consiste à utiliser pd.drop_duplicates () pour créer un index unique de combinaisons de valeurs, chacune avec son propre identifiant, puis grouper sur cet identifiant. Il est plus verbeux mais fait le travail:
Notez que vous pouvez maintenant simplement faire ce qui suit:
Cela renverra le résultat réussi sans avoir à vous soucier d'écraser des données réelles qui sont confondues avec une valeur fictive.
la source
J'ai déjà répondu à cela, mais pour une raison quelconque, la réponse a été convertie en commentaire. Néanmoins, c'est la solution la plus efficace:
Le fait de ne pas pouvoir inclure (et propager) les NaN dans des groupes est assez aggravant. Citer R n'est pas convaincant, car ce comportement n'est pas cohérent avec beaucoup d'autres choses. Quoi qu'il en soit, le hack factice est également assez mauvais. Cependant, la taille (inclut les NaN) et le nombre (ignore les NaN) d'un groupe diffèrent s'il y a des NaN.
Lorsque ceux-ci diffèrent, vous pouvez redéfinir la valeur sur Aucun pour le résultat de la fonction d'agrégation pour ce groupe.
la source
Installé Pandas 1.1 dans Anaconda
Je ne suis pas en mesure de commenter la réponse de cs95 mais il m'a aidé à résoudre le problème.
J'ai essayé d'installer Pandas 1.1 mais cela a échoué en utilisant son code, donc j'ai cherché sur Google et j'ai pu installer.
Je lance d'abord l'invite anaconda en tant qu'administrateur et je colle le code suivant:
pip install pandas==1.1.0rc0
Après cela, utilisez
dropna = False
Lien: https://libraries.io/pypi/pandas
la source
df = df.fillna("")
cela a fonctionné pour moila source