問題があり、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で満たされたフォーマットされていない出力を返しました
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)
実際のパフォーマンスはデータと設定に依存するため、走行距離は異なる場合があります。
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
count
とsize
の差分を使用する
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