2016-06-30 225 views
3

我有一個數據幀:大熊貓的Python,基於行的條件選擇列

import pandas as pd 
df = pd.DataFrame(np.random.randn(2, 4)) 
print(df) 
      0   1   2   3 
0 1.489198 1.329603 1.590124 1.123505 
1 0.024017 0.581033 2.500397 0.156280 

我想選擇其中的至少有一個排比2更大的值的列。我嘗試了以下方法,但沒有按預期工作。

df[df.columns[df.iloc[(0,1)]>2]] 

在這個玩具的例子我的預期輸出是:

 2 
1.590124 
2.500397 

回答

3

使用gtany過濾DF:

In [287]: 
df.ix[:,df.gt(2).any()] 

Out[287]: 
      2 
0 1.590124 
1 2.500397 

這裏我們使用ix選擇所有行,第一:和下一個arg是一個布爾面具滿足條件的列:

In [288]: 
df.gt(2) 

Out[288]: 
     0  1  2  3 
0 False False False False 
1 False False True False 

In [289]: 
df.gt(2).any() 

Out[289]: 
0 False 
1 False 
2  True 
3 False 
dtype: bool 

在您的示例中,您所做的是選擇單元格va泰倫的第一行和第二列,您然後試圖以此來掩蓋列,但這個只是返回的第一列,因此它爲什麼不工作:

In [291]: 
df.iloc[(0,1)] 

Out[291]: 
1.3296030000000001 

In [293]: 
df.columns[df.iloc[(0,1)]>2] 

Out[293]: 
'0' 
+0

downvoter謹慎解釋? – EdChum

+0

對於你們兩個人來說,有人知道我的劇本應該做什麼嗎? –

+0

這'df.iloc [(0,1)]'選擇的第一行和第二列的單元格值和測試,如果它是大於2,它不是,所以它不會對你的答案 – EdChum

1

使用maskdf > 2any創建,然後通過ix選擇列:

import pandas as pd 
np.random.seed(18) 
df = pd.DataFrame(np.random.randn(2, 4)) 
print(df) 
      0   1   2   3 
0 0.079428 2.190202 -0.134892 0.160518 
1 0.442698 0.623391 1.008903 0.394249 

print ((df>2).any()) 
0 False 
1  True 
2 False 
3 False 
dtype: bool 

print (df.ix[:, (df>2).any()]) 
      1 
0 2.190202 
1 0.623391 

編輯的評論:

Y您可以同時按當事人之間的檢查您的解決方案:

看來它的工作原理,但它總是選擇第二列(1,從0蟒蛇計數)列,如果條件True

print (df.iloc[(0,1)]) 
2.19020235741 

print (df.iloc[(0,1)] > 2) 
True 

print (df.columns[df.iloc[(0,1)]>2]) 
1 

print (df[df.columns[df.iloc[(0,1)]>2]]) 
0 2.190202 
1 0.623391 
Name: 1, dtype: float64 

和第一列(0)列如果False,因爲布爾TrueFalse被澆鑄10

np.random.seed(15) 
df = pd.DataFrame(np.random.randn(2, 4)) 
print (df) 
      0   1   2   3 
0 -0.312328 0.339285 -0.155909 -0.501790 
1 0.235569 -1.763605 -1.095862 -1.087766 

print (df.iloc[(0,1)]) 
0.339284706046 

print (df.iloc[(0,1)] > 2) 
False 

print (df.columns[df.iloc[(0,1)]>2]) 
0 

print (df[df.columns[df.iloc[(0,1)]>2]]) 
0 -0.312328 
1 0.235569 
Name: 0, dtype: float64 

如果改變列名:

np.random.seed(15) 
df = pd.DataFrame(np.random.randn(2, 4)) 
df.columns = ['a','b','c','d'] 
print (df) 
      a   b   c   d 
0 -0.312328 0.339285 -0.155909 -0.501790 
1 0.235569 -1.763605 -1.095862 -1.087766 

print (df.iloc[(0,1)] > 2) 
False 

print (df[df.columns[df.iloc[(0,1)]>2]]) 
0 -0.312328 
1 0.235569 
Name: a, dtype: float64 
+0

好thkx你們兩個,誰知道是什麼我的腳本應該這樣做? –

+0

我試着用樣品解釋一下,請檢查一下。 – jezrael

+0

thx很多jezrael –