熊猫-检查数据框在任何列中是否为负值

时间:2020-08-07 01:44:17

标签: python pandas

我想知道如何检查pandas数据框在1列或更多列中是否为负值,并且 仅返回布尔值(True或False)。你能帮忙吗?

In[1]: df = pd.DataFrame(np.random.randn(10, 3))

In[2]: df
Out[2]:
          0         1         2
0 -1.783811  0.736010  0.865427
1 -1.243160  0.255592  1.670268
2  0.820835  0.246249  0.288464
3 -0.923907 -0.199402  0.090250
4 -1.575614 -1.141441  0.689282
5 -1.051722  0.513397  1.471071
6  2.549089  0.977407  0.686614
7 -1.417064  0.181957  0.351824
8  0.643760  0.867286  1.166715
9 -0.316672 -0.647559  1.331545

预期输出:-

Out[3]: True

3 个答案:

答案 0 :(得分:3)

这可以解决问题:

(df < 0).any().any()

要对其进行分解,(df < 0)给出了具有布尔条目的数据框。然后,第一个.any()返回一系列布尔值,在每个列中测试True值的存在。然后,第二个.any()询问返回的系列本身是否包含任何True值。

这将返回一个简单的结果:

True

答案 1 :(得分:2)

您可以链接两个any

df.lt(0).any().any()
Out[96]: True

答案 2 :(得分:1)

实际上,如果速度很重要,我做了一些测试:

df = pd.DataFrame(np.random.randn(10000, 30000))

测试1,最慢:纯熊猫

(df < 0).any().any()
# 303 ms ± 1.28 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

测试2,更快:使用.values切换到numpy来测试True条目的存在

(df < 0).values.any()
# 269 ms ± 8.19 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

测试3,甚至更快,尽管并不重要:整个过程都切换到numpy

(df.values < 0).any()
# 267 ms ± 1.48 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)