Выберите фрейм данных, используя логическое выделение, а затем извлеките значение, соответствующее определенному столбцу. - PullRequest
0 голосов
/ 28 февраля 2019

Пример dataframe:

import pandas as pd
df = pd.DataFrame({'a': [-3, -2, 0], 'b': [-2, 2, 5], 'c': [-1, 0, 7], 'd': [1, 4, 8]})

Я пытаюсь сделать что-то, что, как я ожидаю, будет довольно простым, и что действительно актуально в других языках, поддерживающих класс dataframe, таких как R. Я простоЯ хочу извлечь одно значение из df, с единственным предупреждением, что я выбираю строку с логическим выражением (скажем, `" a "== 0) вместо использования метки.Вместо этого столбец выбирается по метке, как обычно.Например, это работает, но кажется излишне расточительным:

df["c"][df["a"]==0][1] 

Вместо того, чтобы непосредственно извлекать значение из кадра данных, эта инструкция 1) извлекает серию Pandas, 2) выбирает строку в ряду и 3) выбирает второй элемент массива, возвращаемый выбором строки!(первый элемент - индекс).Мало того, что это кажется излишне сложным, но я волнуюсь, что это может также быть медленным для очень больших фреймов данных.

Я пробовал другие решения, используя .at или .iat, но, похоже, ничего не работает.Разве нет более простого / умного способа сделать это?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Использование nonzero с iat

df.iat[(df.a==0).nonzero()[0][0],2]
Out[114]: 7
0 голосов
/ 28 февраля 2019

Вы не можете сделать это за один выстрел:

In [11]: df.loc[df["a"]==0, "c"]
Out[11]:
2    7
Name: c, dtype: int64

In [12]: df.loc[df["a"]==0, "c"].iat[0]
Out[12]: 7
...