web-dev-qa-db-ja.com

Groupbyクラスとフィーチャの欠損値のカウント

問題があり、Webやドキュメントで解決策を見つけることができません。たとえそれが非常に些細なことだと思ってもです。

何をしたいですか?

私はこのようなデータフレームを持っています

_CLASS FEATURE1 FEATURE2 FEATURE3
  X      A       NaN      NaN
  X     NaN       A       NaN
  B      A        A        A
_

Label([〜#〜] class [〜#〜])でグル​​ープ化し、すべての機能でカウントされるNaN-Valueの数を表示して、次のようにします。これの目的は、さまざまなクラスで欠損値がどのように分布するかを一般的に理解することです。

_CLASS FEATURE1 FEATURE2 FEATURE3
  X      1        1        2
  B      0        0        0
_

nonnull-Values-df.groupby['CLASS'].count()の量を受け取る方法を知っています

NaN-Valuesに類似したものはありますか?

Size()からcount()を減算しようとしましたが、値NaNで満たされたフォーマットされていない出力を返しました

17
FlixRo

isnaを使用してマスクを計算し、グループ化して合計を求めます。

df.drop('CLASS', 1).isna().groupby(df.CLASS, sort=False).sum().reset_index()

  CLASS  FEATURE1  FEATURE2  FEATURE3
0     X       1.0       1.0       2.0
1     B       0.0       0.0       0.0

別のオプションは、0に沿ってsizeを使用してcountからrsubを引くことです。番目 インデックスに沿った減算の軸:

df.groupby('CLASS').count().rsub(df.groupby('CLASS').size(), axis=0)

または、

g = df.groupby('CLASS')
g.count().rsub(g.size(), axis=0)
       FEATURE1  FEATURE2  FEATURE3
CLASS                              
B             0         0         0
X             1         1         2

たくさんの良い答えがあるので、ここにあなたの閲覧のためのいくつかのtimeitsがあります:

df_ = df
df = pd.concat([df_] * 10000)

%timeit df.drop('CLASS', 1).isna().groupby(df.CLASS, sort=False).sum()
%timeit df.set_index('CLASS').isna().sum(level=0)    
%%timeit
g = df.groupby('CLASS')
g.count().rsub(g.size(), axis=0)

11.8 ms ± 108 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
9.47 ms ± 379 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
6.54 ms ± 81.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

実際のパフォーマンスはデータと設定に依存するため、走行距離は異なる場合があります。

16
cs95

set_indexおよびsumを使用できます。

df.set_index('CLASS').isna().sum(level=0)

出力:

       FEATURE1  FEATURE2  FEATURE3
CLASS                              
X           1.0       1.0       2.0
B           0.0       0.0       0.0
13
Scott Boston

countsizeの差分を使用する

g=df.groupby('CLASS')

-g.count().sub(g.size(),0)

          FEATURE1  FEATURE2  FEATURE3
CLASS                              
B             0         0         0
X             1         1         2

そして、この質問をより一般的な質問に変換して、forループでデータフレーム内のNaNの数を数える方法を作ることができます

pd.DataFrame({x: y.isna().sum()for x , y in g }).T.drop('CLASS',1)
Out[468]: 
   FEATURE1  FEATURE2  FEATURE3
B         0         0         0
X         1         1         2
7
WeNYoBen