对于某些df列,如果80%的列是NAN 。
什么是最简单的代码来放置这样的列?
For certain columns of df, if 80% of the column is NAN.
What's the simplest code to drop such columns?
最满意答案
你可以使用isnull和mean作为阈值,然后通过使用loc的boolean indexing删除列(因为删除列),也需要反转条件 - 所以<.8意味着删除所有列>=0.8 :
df = df.loc[:, df.isnull().mean() < .8]样品:
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如果想通过最小值删除列dropna与参数thresh和axis=1很好地工作以删除列:
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编辑:对于非布尔数据
列中NaN条目的总数必须少于总条目的80%:
df = df.loc[:, df.isnull().sum() < 0.8*df.shape[0]]You can use isnull with mean for treshold 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.175410If 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 NaNEDIT: 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]]更多推荐
发布评论