2016-03-22 114 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。