2016-03-22 116 views
0

假设我使用了df.isnull()。sum(),并且我得到了df数据框所有列中所有'NA'值的计数。我想删除NA值高于'K'的列。删除列中有'N'个NA值的列-python

对于例如,

df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8], 
       'B': [0, np.nan, np.nan, 0, 0, 0], 
       'C': [0, 0, 0, 0, 0, 0.0], 
       'D': [5, 5, np.nan, np.nan, 5.6, 6.8], 
       'E': [0,np.nan,np.nan,np.nan,np.nan,np.nan],}) 
df.isnull().sum() 

A 1 
B 2 
C 0 
D 2 
E 5 
dtype: int64 

假设我想删除具有 '2' 和上述NA值的数目的列。如何解决这个问题?我的输出应该是,

df.columns 
A,C 

任何人都可以帮助我这样做吗?

感谢

+0

对不起你是指'NaN'或字符串'NA'?此外,您的期望输出不符合您的数据和理想的结果应该是什么 – EdChum

+0

@EdChum对不起。我的错。我的意思是NaN值。我现在将改变DF。 – Observer

+0

@EdChum对不起,再次感到困惑。现在改变了它。 – Observer

回答

3

呼叫dropna并通过axis=1下降逐列,并通过thresh=len(df)-K,什么thresh所做的就是将非NaN值的最小数量等于行数减去ķNaN值

In [22]: 

df.dropna(axis=1, thresh=len(df)-1) 
Out[22]: 
    A C 
0 1.0 0 
1 2.1 0 
2 NaN 0 
3 4.7 0 
4 5.6 0 
5 6.8 0 

如果你只是想在列:

In [23]: 
df.dropna(axis=1, thresh=len(df)-1).columns 

Out[23]: 
Index(['A', 'C'], dtype='object') 

或者干脆掩盖罪状对列输出:

In [28]: 
df.columns[df.isnull().sum() <2] 

Out[28]: 
Index(['A', 'C'], dtype='object') 
1

可以这样做:

df = df.reindex(columns=[x for x in df.columns.values if df[x].isnull().sum() < threshold]) 

刚刚建立符合您的要求,即(小于阈空少)列的列表,然后使用该列表重新索引数据帧。所以,如果你设定的阈值,以1:

threshold = 1 
df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8], 
      'B': [0, np.nan, np.nan, 0, 0, 0], 
      'C': [0, 0, 0, 0, 0, 0.0], 
      'D': [5, 5, np.nan, np.nan, 5.6, 6.8], 
      'E': ['NA', 'NA', 'NA', 'NA', 'NA', 'NA'],}) 
df = df.reindex(columns=[x for x in df.columns.values if df[x].isnull().sum() < threshold]) 
df.count() 

将产生:

C 6 
E 6 
dtype: int64 
0

dropna()函数有一个thresh参数,可给非NaN的数量值,您需要,因此这将给你你想要的输出:

df.dropna(axis=1,thresh=5).count() 

A 5 
C 6 
E 6 

如果你想不仅仅是C & E,你必须在这种情况下,脱粒更改为6。