2017-09-28 75 views
3

我在.csv文件以下數據集:如何排除熊貓數據框的某些列?

feature1, feature2, feature3, feature4 
0, 42, 2, 1000 
2, 13, ?, 997 
1, 30, ?, 861 
2, 29, ?, ? 

我想創建一個數據幀大熊貓或numpy的陣列,其中我不具有與未知數據的x%的特徵(其中,x之前在代碼中指定)。

+0

的問題是沒有明確對我來說,你可以顯示預期的輸出 – Wen

+0

對於我想只保存feature1,feature2和他們各自的數據到我的熊貓數據框 對於25%,feature4也將包括在內 –

+0

所以,你試試用什麼替換所有'?'?這是你的問題嗎? –

回答

4

通過使用replacedropna(PS,你需要使用dropna參數THRESH)

import pandas as pd 
import numpy as np 
df.replace('?', np.NaN).dropna(axis=1,thresh=0.75*len(df)) # for you example , we only accpet one NA here 

Out[735]: 
    feature1 feature2 feature4 
0   0   1  100.0 
1   2   2  900.0 
2   1   3  861.0 
3   2   4  NaN 

數據輸入

df = pd.DataFrame({'feature1': [0,2,1,2], 'feature2': [1,2,3,4],'feature3':[2,'?','?','?'],'feature4':[100,900,861,'?']}) 
+0

哇,這似乎是SO網站中的一種錯誤。您之前發佈了答案,然後將其刪除。當我正在處理我的答案時,我保持打開頁面,並不斷檢查是否有人已經回答。但是,該網頁並未顯示您的答案,因爲我猜,您「取消刪除」了原始答案。所以沒有顯示任何新的答案。所以,我無法知道任何人已經回答。 –

0

這可能是解決這個問題的最簡單的方法,如果我正確理解你的問題。 您可以使用np.nan?更改爲NaN,然後使用df.locdf.isnull來選擇所需的列。

df.replace(to_replace= '\?', value=np.nan, inplace=True, regex=True) 
df = df.loc[:, (df.isnull().sum() <= len(df)/4)] 
print (df) 
     feature1 feature2 feature4 
0   0   42  1000 
1   2   13  997 
2   1   30  861 
3   2   29  NaN 
1

我打算假設那些'?'爲空值。如果他們不這樣做,請執行如下操作:

df = df.apply(pd.to_numeric, errors='coerce') 

現在,我們可以製作一個採用數據幀和閾值的函數。我們想要做的是使用loc和一個布爾序列,告訴我們哪些列有足夠的數據表示。

drp = lambda d, x: d.loc[:, d.isnull().mean() < x] 

drp(df, .5) 

    feature1 feature2 feature4 
0   0  42 1000.0 
1   2  13  997.0 
2   1  30  861.0 
3   2  29  NaN 

如果你堅持認爲'?'保持這樣的......我們還可以包括NaN

d = df.mask(df.astype(object).eq('?')) 

drp = lambda d, x: d.loc[:, d.isnull().mean() < x] 

drp(d, .5) 
+0

OP實際上在他的評論中說'?'不是空值。 –