Отбрасывать строки в группе, когда метка времени выше, чем строка со значением в той же группе - PullRequest
2 голосов
/ 10 июля 2020
  • Считайте, что это pandas фрейм данных , упорядоченный по пользователю и метке времени
  • См. Первую таблицу - есть две группы пользователей - Пользователь 1 и 2
  • Содержимое Плюс является частью пользователя 1 и идет после содержимого END пользователя 1
  • содержимого Cast является частью пользователя 2 и идет после содержимого END пользователя 2

Q: Как удалить все строки , которые могут существовать после содержимого END, на основе его временной метки для каждой группы пользователей , как показано во второй таблице.

  1. Пожалуйста, не поймите , что я просто хочу отбросить последнюю строку каждой группы. Представьте, что у меня было бы много других.

  2. Я бы не хотел бы использовать структуру l oop и if / else для с этой целью. Вместо этого я безуспешно пытался что-то вроде этого

df[df['timestamp'] < (df.groupby('user')['timestamp'].transform('max'))]

Но мне нужно добавить условие содержимого (END) и рассмотреть сравнения В ЭТОЙ ГРУППЕ . В этом случае это считается всей меткой времени df.

С уважением

введите описание изображения здесь

1 Ответ

0 голосов
/ 10 июля 2020
myDataFrame = pd.DataFrame(columns=["Content", "User", "Timestamp"], data=[["Airplane", 1, 1515356018],
                                                                           ["Car", 1, 1515356025],
                                                                           ["END", 1, 1515356027],
                                                                           ["Plus", 1, 1515356028],
                                                                           ["Train", 2, 1515356031],
                                                                           ["Trying", 2, 1515356039],
                                                                           ["View", 2, 1515356047],
                                                                           ["END", 2, 1515356050],
                                                                           ["Cast", 2, 1515356055]])

last_considered = myDataFrame["Timestamp"].where(myDataFrame['Content'] == "END").groupby(myDataFrame["User"]).transform("max").astype(int)
to_drop = myDataFrame[myDataFrame['Timestamp'] > last_considered]
to_keep = myDataFrame[myDataFrame['Timestamp'] <= last_considered]
...