2017-09-14 140 views
0

我想選擇只有一個負值或沒有值的列。我怎樣才能構造這個看這個例子?我一直在尋找類似的東西,但沒有成功。謝謝你的幫助。因此,在這個例子中選擇只有一個負值的列

N = 5 
np.random.seed(0) 

df1 = pd.DataFrame(
      {'X':np.random.uniform(-3,3,N), 
      'Y':np.random.uniform(-3,3,N), 
      'Z':np.random.uniform(-3,3,N), 
       }) 

      X   Y   Z 
0 0.292881 0.875365 1.750350 
1 1.291136 -0.374477 0.173370 
2 0.616580 2.350638 0.408267 
3 0.269299 2.781977 2.553580 
4 -0.458071 -0.699351 -2.573784 

我想返回列X和Z

回答

2

您可以使用ILOC要做到這一點,即

df1.iloc[:,((df1<0).sum(0) <= 1).values] 

或(感謝喬恩)

df1.loc[:,df1.lt(0).sum() <= 1] 

輸出:

 
      X   Z 
0 0.292881 1.750350 
1 1.291136 0.173370 
2 0.616580 0.408267 
3 0.269299 2.553580 
4 -0.458071 -2.573784 
+0

是的,我假設OP只需要col名稱。 – Divakar

+1

或者使用'df1.loc [:,df1.lt(0).sum()<= 1]'而不是'iloc' –

+0

@JonClements是否不經過棄用?.loc?雖然熊貓人可以有更多的信息,但我只是在空中發現了很少的謠言。 – Divakar

4

使用np.sign得到跡象。尋找負面跡象。獲取每列的負數。比較1的門檻來得到一個面具。從掩碼中選擇列名稱。

因此,實施 -

df1.columns[(np.sign(df1)<0).sum(0)<=1].tolist() 

或者直接比較反對0更換使用np.sign -

df1.columns[(df1<0).sum(0)<=1].tolist() 

這給我們的列名。要選擇整個列,我認爲已經涵蓋了其他解決方案。

+0

或者......也許......'df1.columns [df1.lt(0).sum()== 1]' –

+0

@JonClements Yup也可以用'sum(0)'和'<='修正。或者我們不需要'sum(0)'部分和'sum()'也足夠了? – Divakar

+0

@JonClements Ah'sum'默認爲'0',是嗎?來自NumPy我假設總和(無),即總結給我們一個標量的所有元素。 – Divakar

0

或者你可以嘗試:

df1.columns[(df1<0).sum(0).lt(1)] 
Out[338]: Index(['X', 'Z'], dtype='object') 
+1

OP表示欄目。不是行。 – Dark

+0

@Bharathshetty LOL更新 – Wen