您可以使用
isnull与
mean用于treshold,然后删除列
booleanindexing用
loc(因为删除列),还需要反转的条件-这样
<.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.nandf.loc[:5, 'C'] = np.nandf.loc[20:, 'D'] = np.nanprint (df.isnull().mean())A 0.81B 0.00C 0.06D 0.80E 0.00dtype: float64df = df.loc[:, df.isnull().mean() < .8]print (df.head()) B C E0 0.278369 NaN 0.0047191 0.670749 NaN 0.5750932 0.209202 NaN 0.2196973 0.811683 NaN 0.2740744 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 90 NaN NaN NaN 1.0 1.0 NaN NaN NaN NaN NaN1 1.0 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN2 NaN NaN NaN NaN NaN 1.0 1.0 NaN NaN NaN3 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN4 NaN NaN NaN NaN NaN 1.0 NaN NaN NaN 1.05 NaN NaN NaN 1.0 1.0 NaN NaN 1.0 NaN 1.06 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN7 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN8 NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN9 1.0 NaN NaN NaN 1.0 NaN NaN 1.0 NaN NaNdf1 = df.dropna(thresh=2, axis=1)print (df1) 0 3 4 5 7 90 NaN 1.0 1.0 NaN NaN NaN1 1.0 NaN NaN NaN NaN NaN2 NaN NaN NaN 1.0 NaN NaN3 NaN NaN 1.0 NaN NaN NaN4 NaN NaN NaN 1.0 NaN 1.05 NaN 1.0 1.0 NaN 1.0 1.06 NaN NaN NaN NaN NaN NaN7 NaN NaN NaN NaN NaN NaN8 NaN NaN NaN NaN 1.0 NaN9 1.0 NaN 1.0 NaN 1.0 NaN
编辑:对于非布尔数据
列中的NaN条目总数必须少于条目总数的80%:
df = df.loc[:, df.isnull().sum() < 0.8*df.shape[0]]



