如何根据数据框的NAN百分比删除列?(How to drop column according to NAN percentage for dataframe?)

编程入门 行业动态 更新时间:2024-10-28 10:27:32
如何根据数据框的NAN百分比删除列?(How to drop column according to NAN percentage for dataframe?)

对于某些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.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]]

更多推荐

本文发布于:2023-08-07 20:00:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1465700.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:百分比   数据   NAN   drop   percentage

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!