如何根据数据帧的NAN百分比删除列?

时间:2017-04-09 20:25:43

标签: python pandas dataframe nan

对于df的某些列,如果列的80%是NAN

删除此类列的最简单的代码是什么?

4 个答案:

答案 0 :(得分:22)

您可以将isnullmean一起用于阈值,然后使用loc boolean indexing删除列(因为删除列),也需要反转条件 - 所以{{1 }表示删除所有列<.8

>=0.8

样品:

df = df.loc[:, df.isnull().mean() < .8]

如果要删除最小值dropna的列,请使用参数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 thresh删除列,以便删除列:

axis=1

编辑:对于非布尔数据

列中NaN条目的总数必须少于总条目的80%:

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

答案 1 :(得分:4)

正如评论中所建议的那样,如果在布尔测试中使用sum(),则可以获得出现次数。

<强>代码:

def get_nan_cols(df, nan_percent=0.8):
    threshold = len(df.index) * nan_percent
    return [c for c in df.columns if sum(df[c].isnull()) >= threshold]  

用作:

del df[get_nan_cols(df, 0.8)]

答案 2 :(得分:1)

您可以使用熊猫dropna。例如:

df.dropna(axis=1, thresh = int(0.8*df.shape[0]), inplace=True)

答案 3 :(得分:0)

df.dropna(thresh=np.int((100-percent_NA_cols_required)*(len(df.columns)/100)),inplace=True)

基本上,如果要删除该行,pd.dropna将获取所需的non_na cols数(int)。