Удалить n следующих строк во временном индексируемом кадре данных Pandas на основе значения в приведенной выше строке - PullRequest
2 голосов
/ 03 октября 2019

Работает на пандах и должен удалить n последовательных строк в кадре данных на основе значения в столбце.

В приведенном ниже примере в 17:00:01 есть событие, которое длится 2 секунды. Мне нужно, чтобы следующие 2 строки в этом промежутке времени упали. В 17:00:04 есть еще одно событие, и затем следует удалить строку 17:00:05.

Не знаете, как к этому подойти. Использовать маскировку в лямде?

t = pd.to_timedelta(df['EventSeconds'], unit='s')
mask = df['2019-01-07 17:00:02' : '2019-01-07 17:00:02' + t]

У меня есть:

Index               EventSeconds OtherColumn
07/01/2019 16:59:59 0            2
07/01/2019 17:00:00 2            3
07/01/2019 17:00:01 0            4
07/01/2019 17:00:02 0            5
07/01/2019 17:00:03 0            6
07/01/2019 17:00:04 1            7
07/01/2019 17:00:05 0            8
07/01/2019 17:00:06 0            9

Мне нужно:

Index               EventSeconds OtherColumn
07/01/2019 16:59:59 0            2
07/01/2019 17:00:00 2            3
07/01/2019 17:00:03 0            6
07/01/2019 17:00:04 1            7
07/01/2019 17:00:06 0            9

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Вы можете добавить продолжительность к Index, чтобы получить время окончания, но вам нужно использовать ffill даже для 0 секунд:

t = pd.to_timedelta(df['EventSeconds'], unit='s')

# print end_times to see details    
end_times = (df['Index'].add(t)                   # calculate the end time
                .where(df['EventSeconds'].ne(0))  # mask the starting events
                .ffill()                          # fill the same end times
            )

df[df['Index'].gt(end_times)| df['EventSeconds'].ne(0) ]

Вывод:

                Index  EventSeconds
0 2019-07-01 16:59:59             0
1 2019-07-01 17:00:00             2
4 2019-07-01 17:00:03             0
5 2019-07-01 17:00:04             1
7 2019-07-01 17:00:06             0
0 голосов
/ 03 октября 2019

Вы можете использовать Series.shift с Series.cumsum , чтобы заставить серию выполнить логическое индексирование :

c=df['EventSeconds'].ne(df['EventSeconds'].shift())&df['EventSeconds'].ne(df['EventSeconds'].shift(-1))
d=c.cumsum()
df[d.ne(d.shift())|d.ne(d.shift(-1))]

Вывод:

                Index  EventSeconds  OtherColumn
0 2019-07-01 16:59:59             0            2
1 2019-07-01 17:00:00             2            3
4 2019-07-01 17:00:03             0            6
5 2019-07-01 17:00:04             1            7
7 2019-07-01 17:00:06             0            9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...