Yes, numpy can do the same maybe and faster than pandas:
df = pd.DataFrame({'name': {0: 'john', 1: 'jen'},
'age': {0: 18, 1: 25},
'height': {0: 178, 1: 168}})
print((df['age'] > 20) & (df['height'] < 170) & (df['height'] > 150))
0 False
1 True
dtype: bool
m = df.values.T # Note the transposition
print((m[1] > 20) & (m[2] < 170) & (m[2] > 150))
array([False, True])
Performance
>>> %timeit (df['age'] > 20) & (df['height'] < 170) & (df['height'] > 150)
392 µs ± 1.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit (m[1] > 20) & (m[2] < 170) & (m[2] > 150)
6.69 µs ± 12.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)