如何选择所有包含大于某个阈值的值的行?

20

请求很简单:我想选择所有行中包含一个大于阈值的值。

如果我像这样做:


df[(df > threshold)]

我得到了这些行,但是低于该阈值的值只是NaN。如何避免选择这些行?

2个回答

32

完全没有必要进行双重转置,您可以在布尔矩阵上沿列索引(提供 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>

1
超级棒的答案。 - jezrael
我想为其他学习 Pandas 的人添加一些澄清。最初,我认为它应该写成:any(0),但我猜在这种情况下,你应该这样解释:axis=0 意味着沿着行轴(即每个值沿着给定列读取行轴)的 ALONG 或 ACROSS,而 axis=1 意味着沿着列轴(也就是每个值沿着给定行读取列轴)的 ALONG 或 ACROSS。这个 SO 问题对我有所启发。 - racl101
如果您想选择那些在阈值以上的列,同时保留所有行,该怎么办?由于某种原因,将.any(1)更改为.any(0)对我来说并没有起到这样的效果。实际上,在我的数据框中,它会给我一个索引错误(IndexingError: Unalignable boolean Series provided as indexer)。 - skleijn

1
这实际上非常简单:

df[df.T[(df.T > 0.33)].any()]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接