2017-08-04 4 views
-5

私は機能に欠けている値が多い機械学習の問題に取り組んでいます。 100種類の機能があり、欠けている値が多すぎる機能を削除したい(80%以上の値が欠落している機能)。どうすればPythonでそれを行うことができますか?Pythonで欠けている値が多すぎる列を削除する方法

p.s.私のデータはパンダのデータフレームです。

+1

あなたはいくつかのサンプルデータを投稿する場合は、迅速な答えを得るでしょう、100%のチャンスがあります、https://stackoverflow.com/help/mcve、例えばdf.head()。to_dict() –

+1

https://www.google.com/search?q=how+to+remove+columns+with+too+many+missing+values+in+Python&oq=how+to+ Python&aqs = chrome..69i57j69i60.1301j0j7&sourceid = chrome&ie = UTF-8 – Alexander

答えて

2

デモ:

セットアップ:

In [105]: df = pd.DataFrame(np.random.choice([2,np.nan], (20, 5), p=[0.2, 0.8]), columns=list('abcde')) 

In [106]: df 
Out[106]: 
     a b c d e 
0 NaN 2.0 NaN NaN NaN 
1 NaN NaN 2.0 NaN 2.0 
2 NaN 2.0 NaN NaN NaN 
3 NaN NaN NaN NaN 2.0 
4 NaN 2.0 2.0 NaN NaN 
5 NaN NaN NaN NaN NaN 
6 NaN 2.0 NaN NaN NaN 
7 2.0 2.0 NaN NaN NaN 
8 2.0 2.0 NaN NaN NaN 
9 NaN NaN NaN NaN NaN 
10 NaN 2.0 2.0 NaN 2.0 
11 NaN NaN NaN 2.0 NaN 
12 2.0 NaN NaN 2.0 NaN 
13 NaN NaN NaN 2.0 NaN 
14 NaN NaN NaN 2.0 2.0 
15 NaN NaN NaN NaN NaN 
16 NaN 2.0 NaN NaN NaN 
17 2.0 NaN NaN NaN 2.0 
18 NaN NaN NaN 2.0 NaN 
19 NaN 2.0 NaN 2.0 NaN 

In [107]: df.isnull().mean() 
Out[107]: 
a 0.80 
b 0.55 
c 0.85 
d 0.70 
e 0.75 
dtype: float64 

ソリューション:

In [108]: df.columns[df.isnull().mean() < 0.8] 
Out[108]: Index(['b', 'd', 'e'], dtype='object') 

In [109]: df[df.columns[df.isnull().mean() < 0.8]] 
Out[109]: 
     b d e 
0 2.0 NaN NaN 
1 NaN NaN 2.0 
2 2.0 NaN NaN 
3 NaN NaN 2.0 
4 2.0 NaN NaN 
5 NaN NaN NaN 
6 2.0 NaN NaN 
7 2.0 NaN NaN 
8 2.0 NaN NaN 
9 NaN NaN NaN 
10 2.0 NaN 2.0 
11 NaN 2.0 NaN 
12 NaN 2.0 NaN 
13 NaN 2.0 NaN 
14 NaN 2.0 2.0 
15 NaN NaN NaN 
16 2.0 NaN NaN 
17 NaN NaN 2.0 
18 NaN 2.0 NaN 
19 2.0 2.0 NaN 
+1

いつものように大きな解決策、+1。しかし、可視性については、行ではなく列を増やす方が良いと言いたいと思います。私は答えとして行フィルタも追加しました。 (または、たぶん私はラップトップatmに座っている) –

0

パンダ以内に一般化するには、列の値のパーセントを計算するために次の操作を行うことができます不足している値。それらの列から、80%以上のNULL値を持つフィーチャをフィルタリングしてから、それらの列をDataFrameから削除できます。

pct_null = df.isnull().sum()/len(df) 
missing_features = pct_null[pct_null > 0.80].index 
df.drop(missing_features, axis=1, inplace=True) 
1

MaxUの例に続き、これは、フィルタリング行のオプションです:

df = pd.DataFrame(np.random.choice([2,np.nan], (5,10), p=[0.2, 0.8]), columns=list('abcdefghij')) 

a b c d e f g h i j 
0 NaN NaN NaN NaN NaN 2.0 NaN NaN NaN 2.0 
1 NaN 2.0 NaN 2.0 NaN NaN 2.0 NaN NaN 2.0 
2 NaN NaN 2.0 NaN 2.0 NaN 2.0 2.0 NaN NaN 
3 NaN NaN NaN NaN NaN 2.0 NaN NaN NaN 2.0 
4 2.0 2.0 2.0 NaN NaN NaN NaN NaN NaN NaN 

df.loc[df.isnull().mean(axis=1).lt(0.8)] 

    a b c d e f g h i j 
1 NaN 2.0 NaN 2.0 NaN NaN 2.0 NaN NaN 2.0 
2 NaN NaN 2.0 NaN 2.0 NaN 2.0 2.0 NaN NaN 
4 2.0 2.0 2.0 NaN NaN NaN NaN NaN NaN NaN 
関連する問題