2016-06-20 4 views
1

値が少なくとも20%不足している列を効率的に削除する方法はありますか?値が少なくとも20%不足している列を削除する方法

私のデータフレームが似ているとします列を除去した後

A  B  C  D 
0 sg  hh  1  7 
1 gf     9 
2 hh     10 
3 dd     8 
4      6 
5 y     8` 

、データフレームは次のように次のようになります。

A  D 
0 sg  7 
1 gf  9 
2 hh  10 
3 dd  8 
4   6 
5 y  8` 
+0

あなたは(df.isnull使用することができます)、同じのブールDF /シリーズを返されますサイズ。結果の各列の行を合計し、合計行で割りますか?列を適切に削除します。 – Chris

答えて

7

あなたはnotnull値のカウントが大きいcolumnsboolean indexingを使用することができます80%

df.loc[:, pd.notnull(df).sum()>len(df)*.8] 
図示のよう

df.loc[:, (df > 1).sum() > len(df) *. 8] 

また、.dropna()場合のために、あなたも.dropna()threshキーワードを指定することができます。

これは例えば、列をドロップ1よりも大きな値の数は次のようになります場合は、多くの場合に便利です@EdChumによって:

df.dropna(thresh=0.8*len(df), axis=1) 

後者が若干速くなる。

df = pd.DataFrame(np.random.random((100, 5)), columns=list('ABCDE')) 
for col in df: 
    df.loc[np.random.choice(list(range(100)), np.random.randint(10, 30)), col] = np.nan 

%timeit df.loc[:, pd.notnull(df).sum()>len(df)*.8] 
1000 loops, best of 3: 716 µs per loop 

%timeit df.dropna(thresh=0.8*len(df), axis=1) 
1000 loops, best of 3: 537 µs per loop 
+0

+ INF、ありがとう、これは動作します:) –

+0

上記の2つの方法でどちらが効率的になりますか –

+0

'.dropna()'は少し速くなります。 – Stefan

2

あなたの閾値基準を満たしていない列を削除するdropnaを呼び出してthresh値を渡すことができます:

In [10]:  
frac = len(df) * 0.8 
df.dropna(thresh=frac, axis=1) 

Out[10]: 
    A D 
0 sg 7 
1 gf 9 
2 hh 10 
3 dd 8 
4 NaN 6 
5 y 8 
関連する問題