首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据NAN的百分比对数据进行删除?

如何根据NAN的百分比对数据进行删除?
EN

Stack Overflow用户
提问于 2017-04-09 20:25:42
回答 4查看 25.6K关注 0票数 33

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

删除这些列的最简单代码是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-04-09 20:54:29

您可以使用isnullmean作为阈值,然后用boolean indexingloc删除列(因为移除列),也需要反转条件所以<.8意味着删除所有列>=0.8

代码语言:javascript
复制
df = df.loc[:, df.isnull().mean() < .8]

示例:

代码语言:javascript
复制
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可以很好地使用参数threshaxis=1来删除列:

代码语言:javascript
复制
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%:

代码语言:javascript
复制
 df = df.loc[:, df.isnull().sum() < 0.8*df.shape[0]]
票数 59
EN

Stack Overflow用户

发布于 2017-04-09 21:32:00

代码语言:javascript
复制
df.dropna(thresh=np.int((100-percent_NA_cols_required)*(len(df.columns)/100)),inplace=True)

基本上,如果要删除该行,pd.dropna就需要non_na cols的编号(Int)。

票数 7
EN

Stack Overflow用户

发布于 2017-04-09 20:43:24

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

代码:

代码语言:javascript
复制
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]  

用作:

代码语言:javascript
复制
del df[get_nan_cols(df, 0.8)]
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43311555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档