2017-09-08 1 views
7

Supposons que j'ai une dataframe df avec les colonnes 'A', 'B', 'C'. Je voudrais compter le nombre de valeurs nulles dans la colonne « B » comme regroupés par « A » et de faire un dictionnaire hors de lui:Utilisation de isnull() et groupby() sur une base de données pandas

Essayé ce qui suit en échec: df.groupby('A')['B'].isnull().sum().to_dict()

Toute aide sera apprécié.

Répondre

9

Setup

df = pd.DataFrame(dict(A=[1, 2] * 3, B=[1, 2, None, 4, None, None])) 

df 

    A B 
0 1 1.0 
1 2 2.0 
2 1 NaN 
3 2 4.0 
4 1 NaN 
5 2 NaN 

Option 1

df['B'].isnull().groupby(df['A']).sum().to_dict() 

{1: 2.0, 2: 1.0} 

Option 2

df.groupby('A')['B'].apply(lambda x: x.isnull().sum()).to_dict() 

{1: 2, 2: 1} 

Option 3
faire preuve de créativité

df.A[df.B.isnull()].value_counts().to_dict() 

{1: 2, 2: 1} 

Option 4

from collections import Counter 

dict(Counter(df.A[df.B.isnull()])) 

{1: 2, 2: 1} 

Option 5

from collections import defaultdict 

d = defaultdict(int) 
for t in df.itertuples(): 
    d[t.A] += pd.isnull(t.B) 
dict(d) 

{1: 2, 2: 1} 

Option 6
inutilement complexes

(lambda t: dict(zip(t[1], np.bincount(t[0]))))(df.A[df.B.isnull()].factorize()) 

{1: 2, 2: 1} 

Option 7

df.groupby([df.B.isnull(), 'A']).size().loc[True].to_dict() 

{1: 2, 2: 1} 
+3

Il est vraiment dur de trouver une méthode en dehors de votre boîte :) – Wen

+0

merci @piRSquared Ceci est très utile –

1

Ou en utilisant la différence entre count et size, voir le link

(df.groupby('A')['B'].size()-df.groupby('A')['B'].count()).to_dict() 
Out[119]: {1: 2, 2: 1}