287 votes

colonnes pandas GroupBy avec des valeurs NaN (manquantes)

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 abandonné les lignes avec des valeurs cibles NaN. (Je veux inclure ces lignes !)

Comme j'ai besoin de nombreuses opérations de ce type (de nombreuses colonnes ont des valeurs manquantes), et que j'utilise des fonctions plus compliquées que les médianes (typiquement des forêts aléatoires), je veux éviter d'écrire des morceaux de code trop compliqués.

Des suggestions ? Dois-je écrire une fonction pour cela ou existe-t-il une solution simple ?

6voto

Tuetschek Points 389

Un petit point sur la solution d'Andy Hayden - elle ne fonctionne pas (plus ?) parce que np.nan == np.nan donne False donc le replace ne fait pas grand-chose.

Ce qui a marché pour moi, c'est ça :

df['b'] = df['b'].apply(lambda x: x if not np.isnan(x) else -1)

(Du moins, c'est le comportement de Pandas 0.19.2. Désolé de l'ajouter comme une réponse différente, je n'ai pas assez de réputation pour commenter).

5voto

J'ai déjà répondu à cette question, 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 les 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 dummy est également assez mauvais. Cependant, la taille (incluant les NaNs) et le nombre (ignorant les NaNs) d'un groupe seront différents s'il y a des NaNs.

dfgrouped = df.groupby(['b']).a.agg(['sum','size','count'])

dfgrouped['sum'][dfgrouped['size']!=dfgrouped['count']] = None

Lorsque ceux-ci diffèrent, vous pouvez redonner la valeur None au résultat de la fonction d'agrégation pour ce groupe.

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