Pandas - проверять, имеет ли фрейм данных отрицательное значение в каком-либо столбце - PullRequest
0 голосов
/ 07 августа 2020

Интересно, как проверить, имеет ли фрейм данных 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 ]

2 голосов
/ 07 августа 2020

Это трюк:

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

Чтобы разбить его, (df < 0) дает фрейм данных с логическими записями. Затем первая .any() возвращает серию логических значений, проверяя в каждом столбце наличие значения True. Затем второй .any() спрашивает, содержит ли сама эта возвращенная серия какое-либо значение True.

Это возвращает простой:

True
2 голосов
/ 07 августа 2020

Вы можете связать два any

df.lt(0).any().any()
Out[96]: True
1 голос
/ 10 августа 2020

На самом деле, если скорость важна, я сделал несколько тестов:

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

Тест 1, самый медленный: чистый pandas

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

Тест 2, быстрее: переключение на numpy с .values для проверки наличия записи 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...