Pandas (и numpy) позволяют булевое индексирование , что будет намного более эффективным:
In [11]: df.loc[df['col1'] >= 1, 'col1']
Out[11]:
1 1
2 2
Name: col1
In [12]: df[df['col1'] >= 1]
Out[12]:
col1 col2
1 1 11
2 2 12
In [13]: df[(df['col1'] >= 1) & (df['col1'] <=1 )]
Out[13]:
col1 col2
1 1 11
Если вы хотите написать вспомогательные функции для этого, рассмотрите что-то эти строки:
In [14]: def b(x, col, op, n):
return op(x[col],n)
In [15]: def f(x, *b):
return x[(np.logical_and(*b))]
In [16]: b1 = b(df, 'col1', ge, 1)
In [17]: b2 = b(df, 'col1', le, 1)
In [18]: f(df, b1, b2)
Out[18]:
col1 col2
1 1 11
Обновление: pandas 0.13 имеет метод запроса для этих видов использования, предполагая, что имена столбцов являются действительными идентификаторами, следующие работы (и могут быть более эффективными для больших кадров, поскольку он использует numexpr за кулисами):
In [21]: df.query('col1 <= 1 & 1 <= col1')
Out[21]:
col1 col2
1 1 11