Фильтрация данных, где порог нарушен в Python Datafr

Я пытаюсь отфильтровать список данных о температуре, где температура превышает порог в 7–10 градусов. Моя цель — создать отфильтрованный набор данных о днях, когда температура превышает пороговое значение, но не о промежуточных данных. Я приложил образец таблицы; в настоящее время я использую фильтры высокого/низкого уровня, которые работают, но они включают промежуточные данные, а не список дат, когда происходит выход за пределы порогового значения.

Возможно ли это с простым питоном? Заранее спасибо!

ДатаТемператураФлаг
01 января 219.20
02 января 219.50
03 января 2110.10ВЕРХНИЙ
04 января 2111.00
05 января 2110.50
06 января 2110.20
07 января 219,80
08 января 218.50
09 января 216.20НИЖЕ
10 января 219,90
11 января 2110.10ВЕРХНИЙ
12 января 2110.21
13 января 2111.00
14 января 2112.10
15 января 2111.34
16 января 219.43
17 января 2110.22ВЕРХНИЙ
18 января 2111.00
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
0
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить строки, в которых столбец находится между двумя значениями (оба включительно), вы можете использовать between. В целях демонстрации сохраните это во временном столбце

df['in_range'] = df.Temperature.between(7, 10)

чтобы получить это (пока игнорируя столбец Flag):

>>> df.head(10)
        Date  Temperature  in_range
0  01-Jan-21          9.2      True
1  02-Jan-21          9.5      True
2  03-Jan-21         10.1     False
3  04-Jan-21         11.0     False
4  05-Jan-21         10.5     False
5  06-Jan-21         10.2     False
6  07-Jan-21          9.8      True
7  08-Jan-21          8.5      True
8  09-Jan-21          6.2     False
9  10-Jan-21          9.9      True

Один из вариантов, чтобы получить только первый из ряда последовательных False строк, мы можем выбрать строки, где предыдущая строка True. Мы можем сделать это, используя shift, который по умолчанию сдвигает строки вниз на единицу, т. е. строка 0 становится 1, строка 1 становится 2 и т. д.

>>> df.in_range.shift().head()
0      NaN
1     True
2     True
3    False
4    False
Name: in_range, dtype: object

У первой строки нет предыдущей строки, поэтому она заполняется NaN. Однако в вашем случае нам нужно заполнить его True. Сохранение этого в другом столбце:

>>> df['in_range_shift'] = df.in_range.shift(fill_value=True)
>>> df.head(10)
        Date  Temperature  in_range  in_range_shift
0  01-Jan-21          9.2      True            True
1  02-Jan-21          9.5      True            True
2  03-Jan-21         10.1     False            True # <-
3  04-Jan-21         11.0     False           False
4  05-Jan-21         10.5     False           False
5  06-Jan-21         10.2     False           False
6  07-Jan-21          9.8      True           False
7  08-Jan-21          8.5      True            True
8  09-Jan-21          6.2     False            True # <-
9  10-Jan-21          9.9      True           False

Обратите внимание, как мы получаем (False, True) в последних двух столбцах для каждого значения, которое мы хотим.

Так что просто сделайте:

>>> df[~df.in_range & df.in_range_shift] 
         Date  Temperature  in_range  in_range_shift
2   03-Jan-21        10.10     False            True
8   09-Jan-21         6.20     False            True
10  11-Jan-21        10.10     False            True
16  17-Jan-21        10.22     False            True

Что, конечно, можно сделать гораздо более лаконично с оригиналом df:

>>> m = df.Temperature.between(7, 10)
>>> df[~m & m.shift(fill_value=True)]
         Date  Temperature   Flag
2   03-Jan-21        10.10  UPPER
8   09-Jan-21         6.20  LOWER
10  11-Jan-21        10.10  UPPER
16  17-Jan-21        10.22  UPPER

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

grandpa 10.04.2022 17:58

@grandpa хорошо, теперь я понял - пожалуйста, рассмотрите мой обновленный / расширенный ответ.

fsimonjetz 10.04.2022 19:19

Это идеально - большое спасибо!

grandpa 10.04.2022 20:23

Другие вопросы по теме