2017-11-08 7 views
1

などの非NULL値をカウントGROUPBY、私が行方不明カウントしたい、NaNの値:パンダは、このデータセットを考える割合

df = pd.DataFrame({'A' : [1, np.nan, 2 , 55, 6, np.nan, -17, np.nan], 
        'Team' : ['one', 'one', 'two', 'three','two', 'two', 'one', 'three'], 
        'C' : [4, 14, 3 , 8, 8, 7, np.nan, 11], 
        'D' : [np.nan, np.nan, -12 , 12, 12, -12, np.nan, np.nan]}) 

は、具体的に、私は「チームにグループごとに(割合として)カウントするようにしたいです'列。

df.groupby('Team').count() 

これにより、未処理の数値が取得されます。私がしたいのは、パーセンテージを作成することです。生の数字を取得する代わりに、私はそれを各グループの合計エントリーのパーセンテージとして取得します(私はすべてが不均一なグループのサイズはわかりません)。私は.agg()を使ってみましたが、私が望むものを得ることができません。これどうやってするの?

答えて

3

あなたはnotnullブールデータフレームのmeanをとることができます。

In [11]: df.notnull() 
Out[11]: 
     A  C  D Team 
0 True True False True 
1 False True False True 
2 True True True True 
3 True True True True 
4 True True True True 
5 False True True True 
6 True False False True 
7 False True False True 

In [12]: df.notnull().mean() 
Out[12]: 
A  0.625 
C  0.875 
D  0.500 
Team 1.000 
dtype: float64 

とGROUPBYで:

In [13]: df.groupby("Team").apply(lambda x: x.notnull().mean()) 
Out[13]: 
       A   C D Team 
Team 
one 0.666667 0.666667 0.0 1.0 
three 0.500000 1.000000 0.5 1.0 
two 0.666667 1.000000 1.0 1.0 

最初​​を使用して適用せずにこれを行うに速くなることがあります。

In [14]: df.set_index("Team").notnull().groupby(level=0).mean() 
Out[14]: 
       A   C D 
Team 
one 0.666667 0.666667 0.0 
three 0.500000 1.000000 0.5 
two 0.666667 1.000000 1.0 
+0

ありがとう、私は両方のアプローチが好きです! –

1

独自のコードを基にして012を追加

df.groupby('Team').count().div(df.groupby('Team').size(),0) 
Out[190]: 
       A   C D 
Team       
one 0.666667 0.666667 0.0 
three 0.500000 1.000000 0.5 
two 0.666667 1.000000 1.0 
+0

私は前にdiv関数を見たことがありません。これは本当に便利です。ありがとう! –

関連する問題