Панды Python: условно удалить первую строку каждой группыPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Панды Python: условно удалить первую строку каждой группы

Сообщение Anonymous »

Используя Python 3.6 и Pandas 0.19.2
У меня есть DataFrame, такой как этот:

Код: Выделить всё

   tid                datetime  event  data
0    0 2017-03-22 10:59:59.864  START   NaN
1    0 2017-03-22 10:59:59.931    END   NaN
2    0 2017-03-22 10:59:59.935  START   NaN
3    1 2017-03-22 10:59:59.939    END   NaN
4    0 2017-03-22 10:59:59.940    END   NaN
5    1 2017-03-22 10:59:59.941  START   NaN
6    1 2017-03-22 10:59:59.945    END   NaN
7    0 2017-03-22 10:59:59.947  START   NaN
8    1 2017-03-22 10:59:59.955  START   NaN
который содержит даты начала и окончания транзакций, происходящих внутри потоков (tid — это идентификатор потока). К сожалению, сама транзакция не имеет уникального идентификатора. Поэтому мне нужно сгруппировать эти строки по tid, упорядочить их по дате, а затем взять строки 2 на 2, чтобы иметь 1 START и 1 END для каждой транзакции.
Моя текущая проблема заключается в том, что мой исходный фрейм данных может пропустить первое событие START для каждого потока (в моем примере выше строка с индексом 3 является событием END без предыдущего START). Мне нужно удалить эти КОНЕЧНЫЕ строки, но я не знаю, как это сделать.
Та же проблема с последними НАЧАЛЬНЫМИ строками, у которых нет соответствующей КОНЕЧНОЙ строки.
Пример ввода

Код: Выделить всё

import pandas as pd
import io
df = pd.read_csv(io.StringIO('''tid;datetime;event
0;2017-03-22 10:59:59.864;START
0;2017-03-22 10:59:59.931;END
0;2017-03-22 10:59:59.935;START
1;2017-03-22 10:59:59.939;END
0;2017-03-22 10:59:59.940;END
1;2017-03-22 10:59:59.941;START
1;2017-03-22 10:59:59.945;END
0;2017-03-22 10:59:59.947;START
1;2017-03-22 10:59:59.955;START'''), sep=';', parse_dates=['datetime'])
Ожидаемый результат
Тот же кадр данных, но с опущенной строкой №2, поскольку это первая строка для Tid 1 и не является мероприятием СТАРТ:

Код: Выделить всё

   tid                datetime  event
0    0 2017-03-22 10:59:59.864  START
1    0 2017-03-22 10:59:59.931    END
3    1 2017-03-22 10:59:59.933  START
4    1 2017-03-22 10:59:59.945    END
5    0 2017-03-22 10:59:59.947  START
6    0 2017-03-22 10:59:59.955    END
Кстати, бонусные баллы, если в итоге получится что-то вроде:

Код: Выделить всё

   tid          start_datetime           stop_datetime
0    0 2017-03-22 10:59:59.864 2017-03-22 10:59:59.931
1    1 2017-03-22 10:59:59.933 2017-03-22 10:59:59.945
2    0 2017-03-22 10:59:59.947 2017-03-22 10:59:59.955
Что я пробовал

Код: Выделить всё

df.sort(['tid', 'datetime']).groupby('tid').first().event == 'END'
не содержит исходный индекс из моего фрейма данных, поэтому я не могу использовать его для удаления строк. (или, если можно, то не очевидно, как это сделать)

Подробнее здесь: https://stackoverflow.com/questions/436 ... each-group
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»