如果列满足条件,请选择行

时间:2016-09-06 08:49:02

标签: pandas indexing dataframe conditional-statements any

我有一个包含75列的DataFrame

如何根据特定列数组中的条件选择行?如果我想在所有列上执行此操作,我可以使用

df[(df.values > 1.5).any(1)]

但是,我想说我只想在第3:45栏上这样做。

2 个答案:

答案 0 :(得分:2)

使用ix使用序号位置对列进行切片:

In [31]:
df = pd.DataFrame(np.random.randn(5,10), columns=list('abcdefghij'))
df

Out[31]:
          a         b         c         d         e         f         g  \
0 -0.362353  0.302614 -1.007816 -0.360570  0.317197  1.131796  0.351454   
1  1.008945  0.831101 -0.438534 -0.653173  0.234772 -1.179667  0.172774   
2  0.900610  0.409017 -0.257744  0.167611  1.041648 -0.054558 -0.056346   
3  0.335052  0.195865  0.085661  0.090096  2.098490  0.074971  0.083902   
4 -0.023429 -1.046709  0.607154  2.219594  0.381031 -2.047858 -0.725303   

          h         i         j  
0  0.533436 -0.374395  0.633296  
1  2.018426 -0.406507 -0.834638  
2 -0.079477  0.506729  1.372538  
3 -0.791867  0.220786 -1.275269  
4 -0.584407  0.008437 -0.046714  

所以切换第4到第5列包括:

In [32]:
df.ix[:, 3:5]

Out[32]:
          d         e
0 -0.360570  0.317197
1 -0.653173  0.234772
2  0.167611  1.041648
3  0.090096  2.098490
4  2.219594  0.381031

所以在你的情况下

df[(df.ix[:, 2:45]).values > 1.5).any(1)]

应该有效

索引是基于0并且包含开放范围,但是收盘范围不是这样的,此处包含第3列,我们切入第46列,但这不包含在切片中

答案 1 :(得分:1)

另一个ilocvalues的解决方案可以省略:

#if need from 3rd to 45th columns 
print (df[((df.iloc[:, 2:45]) > 1.5).any(1)])

样品:

np.random.seed(1)
df = pd.DataFrame(np.random.randint(3, size=(5,10)), columns=list('abcdefghij'))
print (df)
   a  b  c  d  e  f  g  h  i  j
0  1  0  0  1  1  0  0  1  0  1
1  0  2  1  2  0  2  1  2  0  0
2  2  0  1  2  2  0  1  1  2  0
3  2  1  1  1  1  2  1  1  0  0
4  1  0  0  1  2  1  0  2  2  1

print (df[((df.iloc[:, 2:5]) > 1.5).any(1)])
   a  b  c  d  e  f  g  h  i  j
1  0  2  1  2  0  2  1  2  0  0
2  2  0  1  2  2  0  1  1  2  0
4  1  0  0  1  2  1  0  2  2  1