请求很简单:我想选择所有行中包含一个大于阈值的值。
如果我像这样做:
df[(df > threshold)]
我得到了这些行,但是低于该阈值的值只是NaN
。如何避免选择这些行?
完全没有必要进行双重转置,您可以在布尔矩阵上沿列索引(提供 1 或 'columns'
)调用 any
函数。
df[(df > threshold).any(1)]
示例
>>> df = pd.DataFrame(np.random.randint(0, 100, 50).reshape(5, 10))
>>> df
0 1 2 3 4 5 6 7 8 9
0 45 53 89 63 62 96 29 56 42 6
1 0 74 41 97 45 46 38 39 0 49
2 37 2 55 68 16 14 93 14 71 84
3 67 45 79 75 27 94 46 43 7 40
4 61 65 73 60 67 83 32 77 33 96
>>> df[(df > 95).any(1)]
0 1 2 3 4 5 6 7 8 9
0 45 53 89 63 62 96 29 56 42 6
1 0 74 41 97 45 46 38 39 0 49
4 61 65 73 60 67 83 32 77 33 96
将自己的答案转置只是不必要的性能损失。
df = pd.DataFrame(np.random.randint(0, 100, 10**8).reshape(10**4, 10**4))
# standard way
%timeit df[(df > 95).any(1)]
1 loop, best of 3: <b>8.48 s per loop</b>
# transposing
%timeit df[df.T[(df.T > 95)].any()]
1 loop, best of 3: <b>13 s per loop</b>
df[df.T[(df.T > 0.33)].any()]
any(0)
,但我猜在这种情况下,你应该这样解释:axis=0 意味着沿着行轴(即每个值沿着给定列读取行轴)的 ALONG 或 ACROSS,而 axis=1 意味着沿着列轴(也就是每个值沿着给定行读取列轴)的 ALONG 或 ACROSS。这个 SO 问题对我有所启发。 - racl101.any(1)
更改为.any(0)
对我来说并没有起到这样的效果。实际上,在我的数据框中,它会给我一个索引错误(IndexingError: Unalignable boolean Series provided as indexer
)。 - skleijn