我想知道如何检查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
答案 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)