Подтвердить что ты не робот

Как выбрать строки в DataFrame между двумя значениями, в Python Pandas?

Я пытаюсь изменить DataFrame df, чтобы содержать только строки, для которых значения в столбце closing_price находятся между 99 и 101 и пытаются сделать это с помощью кода ниже.

Однако я получаю сообщение об ошибке

ValueError: значение истины серии неоднозначно. Используйте команды a.empty, a.bool(), a.item(), a.any() или a.all()

и мне интересно, есть ли способ сделать это без использования циклов.

df = df[(99 <= df['closing_price'] <= 101)]
4b9b3361

Ответ 1

Вы должны использовать (), чтобы сгруппировать свой логический вектор, чтобы удалить неоднозначность.

df = df[(df['closing_price'] >= 99) & (df['closing_price'] <= 101)]

Ответ 2

Также рассмотрим серию между:

df = df[df['closing_price'].between(99, 101)]

Ответ 3

есть более приятная альтернатива - используйте метод query():

In [58]: df = pd.DataFrame({'closing_price': np.random.randint(95, 105, 10)})

In [59]: df
Out[59]:
   closing_price
0            104
1             99
2             98
3             95
4            103
5            101
6            101
7             99
8             95
9             96

In [60]: df.query('99 <= closing_price <= 101')
Out[60]:
   closing_price
1             99
5            101
6            101
7             99

ОБНОВЛЕНИЕ: ответ на комментарий:

Мне нравится синтаксис здесь, но он упал при попытке совместить с expresison; df.query('(mean + 2 *sd) <= closing_price <=(mean + 2 *sd)')

In [161]: qry = "(closing_price.mean() - 2*closing_price.std())" +\
     ...:       " <= closing_price <= " + \
     ...:       "(closing_price.mean() + 2*closing_price.std())"
     ...:

In [162]: df.query(qry)
Out[162]:
   closing_price
0             97
1            101
2             97
3             95
4            100
5             99
6            100
7            101
8             99
9             95

Ответ 4

newdf = df.query('closing_price.mean() <= closing_price <= closing_price.std()')

или

mean = closing_price.mean()
std = closing_price.std()

newdf = df.query('@mean <= closing_price <= @std')

Ответ 5

Вы также можете использовать .between()

emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")

emp[emp["Salary"].between(60000, 61000)]

Выход

enter image description here

Ответ 6

Вместо этого

df = df[(99 <= df['closing_price'] <= 101)]

Вы должны использовать это

df = df[(df['closing_price']>=99 ) & (df['closing_price']<=101)]

Мы должны использовать NumPy поразрядные логические операторы |, &, ~, ^ для составления запросов. Кроме того, круглые скобки важны для приоритета оператора.

Для получения дополнительной информации вы можете перейти по ссылке: " Сравнение", "Маски" и "Логическая логика"

Ответ 7

Если вы имеете дело с несколькими значениями и несколькими входами, вы также можете настроить функцию применения, подобную этой. В этом случае выполняется фильтрация кадра данных для местоположений GPS, которые попадают в определенные диапазоны.

def filter_values(lat,lon):
    if abs(lat - 33.77) < .01 and abs(lon - -118.16) < .01:
        return True
    elif abs(lat - 37.79) < .01 and abs(lon - -122.39) < .01:
        return True
    else:
        return False


df = df[df.apply(lambda x: filter_values(x['lat'],x['lon']),axis=1)]