For certain columns of df
, if 80% of the column is NAN
.
What's the simplest code to drop such columns?
Using DataFrame.dropna() method you can drop columns with Nan (Not a Number) or None values from DataFrame. Note that by default it returns the copy of the DataFrame after removing columns. If you wanted to remove from the existing DataFrame, you should use inplace=True . Yields below output.
Drop column where at least one value is missing If we need to drop such columns that contain NA, we can use the axis=column s parameter of DataFrame. dropna() to specify deleting the columns. By default, it removes the column where one or more values are missing.
By using dropna() method you can drop rows with NaN (Not a Number) and None values from pandas DataFrame. Note that by default it returns the copy of the DataFrame after removing rows. If you wanted to remove from the existing DataFrame, you should use inplace=True .
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
:
df = df.loc[:, df.isnull().mean() < .8]
Sample:
np.random.seed(100) df = pd.DataFrame(np.random.random((100,5)), columns=list('ABCDE')) df.loc[:80, 'A'] = np.nan df.loc[:5, 'C'] = np.nan df.loc[20:, 'D'] = np.nan print (df.isnull().mean()) A 0.81 B 0.00 C 0.06 D 0.80 E 0.00 dtype: float64 df = df.loc[:, df.isnull().mean() < .8] print (df.head()) B C E 0 0.278369 NaN 0.004719 1 0.670749 NaN 0.575093 2 0.209202 NaN 0.219697 3 0.811683 NaN 0.274074 4 0.940030 NaN 0.175410
If want remove columns by minimal values dropna
working nice with parameter thresh
and axis=1
for remove columns:
np.random.seed(1997) df = pd.DataFrame(np.random.choice([np.nan,1], p=(0.8,0.2),size=(10,10))) print (df) 0 1 2 3 4 5 6 7 8 9 0 NaN NaN NaN 1.0 1.0 NaN NaN NaN NaN NaN 1 1.0 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN 1.0 1.0 NaN NaN NaN 3 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN 4 NaN NaN NaN NaN NaN 1.0 NaN NaN NaN 1.0 5 NaN NaN NaN 1.0 1.0 NaN NaN 1.0 NaN 1.0 6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 7 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 8 NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN 9 1.0 NaN NaN NaN 1.0 NaN NaN 1.0 NaN NaN df1 = df.dropna(thresh=2, axis=1) print (df1) 0 3 4 5 7 9 0 NaN 1.0 1.0 NaN NaN NaN 1 1.0 NaN NaN NaN NaN NaN 2 NaN NaN NaN 1.0 NaN NaN 3 NaN NaN 1.0 NaN NaN NaN 4 NaN NaN NaN 1.0 NaN 1.0 5 NaN 1.0 1.0 NaN 1.0 1.0 6 NaN NaN NaN NaN NaN NaN 7 NaN NaN NaN NaN NaN NaN 8 NaN NaN NaN NaN 1.0 NaN 9 1.0 NaN 1.0 NaN 1.0 NaN
EDIT: For non-Boolean data
Total number of NaN entries in a column must be less than 80% of total entries:
df = df.loc[:, df.isnull().sum() < 0.8*df.shape[0]]
df.dropna(thresh=np.int((100-percent_NA_cols_required)*(len(df.columns)/100)),inplace=True)
Basically pd.dropna takes number(int) of non_na cols required if that row is to be removed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With