2016-06-30 182 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 –