For certain columns of df
, if 80% of the column is NAN
.
What’s the simplest code to drop such columns?
Advertisement
Answer
You can use isnull
with mean
for threshold and then remove columns by boolean indexing
with loc
(because remove columns), also need invert condition – so <.8
means remove all columns >=0.8
:
JavaScript
x
2
1
df = df.loc[:, df.isnull().mean() < .8]
2
Sample:
JavaScript
1
23
23
1
np.random.seed(100)
2
df = pd.DataFrame(np.random.random((100,5)), columns=list('ABCDE'))
3
df.loc[:80, 'A'] = np.nan
4
df.loc[:5, 'C'] = np.nan
5
df.loc[20:, 'D'] = np.nan
6
7
print (df.isnull().mean())
8
A 0.81
9
B 0.00
10
C 0.06
11
D 0.80
12
E 0.00
13
dtype: float64
14
15
df = df.loc[:, df.isnull().mean() < .8]
16
print (df.head())
17
B C E
18
0 0.278369 NaN 0.004719
19
1 0.670749 NaN 0.575093
20
2 0.209202 NaN 0.219697
21
3 0.811683 NaN 0.274074
22
4 0.940030 NaN 0.175410
23
If want remove columns by minimal values dropna
working nice with parameter thresh
and axis=1
for remove columns:
JavaScript
1
29
29
1
np.random.seed(1997)
2
df = pd.DataFrame(np.random.choice([np.nan,1], p=(0.8,0.2),size=(10,10)))
3
print (df)
4
0 1 2 3 4 5 6 7 8 9
5
0 NaN NaN NaN 1.0 1.0 NaN NaN NaN NaN NaN
6
1 1.0 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN
7
2 NaN NaN NaN NaN NaN 1.0 1.0 NaN NaN NaN
8
3 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN
9
4 NaN NaN NaN NaN NaN 1.0 NaN NaN NaN 1.0
10
5 NaN NaN NaN 1.0 1.0 NaN NaN 1.0 NaN 1.0
11
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
12
7 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
13
8 NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN
14
9 1.0 NaN NaN NaN 1.0 NaN NaN 1.0 NaN NaN
15
16
df1 = df.dropna(thresh=2, axis=1)
17
print (df1)
18
0 3 4 5 7 9
19
0 NaN 1.0 1.0 NaN NaN NaN
20
1 1.0 NaN NaN NaN NaN NaN
21
2 NaN NaN NaN 1.0 NaN NaN
22
3 NaN NaN 1.0 NaN NaN NaN
23
4 NaN NaN NaN 1.0 NaN 1.0
24
5 NaN 1.0 1.0 NaN 1.0 1.0
25
6 NaN NaN NaN NaN NaN NaN
26
7 NaN NaN NaN NaN NaN NaN
27
8 NaN NaN NaN NaN 1.0 NaN
28
9 1.0 NaN 1.0 NaN 1.0 NaN
29
EDIT: For non-Boolean data
Total number of NaN entries in a column must be less than 80% of total entries:
JavaScript
1
2
1
df = df.loc[:, df.isnull().sum() < 0.8*df.shape[0]]
2