>>> names = ['Id', 'Datetime', 'Drug']
>>> df = pd.read_csv('drugs.csv', names=names, parse_dates=['Datetime'])
>>> df
Id Datetime Drug
0 66531 2012-12-18 08:31:00 acetaminophen-HYDROcodone
1 66531 2012-12-18 17:44:00 acetaminophen-HYDROcodone
2 66531 2013-02-18 22:36:00 morphine
3 66531 2013-02-19 05:07:00 morphine
4 66531 2013-02-19 10:13:00 morphine
5 66531 2013-02-19 15:27:00 morphine
6 66531 2013-02-19 17:33:00 oxyCODONE
7 66531 2013-02-19 19:20:00 acetaminophen-HYDROcodone
8 66531 2013-02-19 20:54:00 methadone
9 66531 2013-02-20 06:46:00 methadone
10 66531 2013-02-20 13:21:00 methadone
11 66531 2013-02-20 22:18:00 methadone
Затем переберите все комбинации строк. Это работает, но не самое эффективное решение. Если ваш набор данных очень большой, вы можете рассмотреть более элегантный подход.
drop_idx = set([])
for idx_early, row_early in df.iterrows():
for idx_late, row_late in df.iterrows():
if (row_early['Datetime'] + pd.DateOffset(hours=24) > row_late['Datetime'] and
row_early['Datetime'] < row_late['Datetime'] and
row_early['Drug'] == 'morphine' and
row_late['Drug'] == 'methadone' and
row_early['Id'] == row_late['Id']):
drop_idx.add(idx_early)
Теперь отбросьте идентифицированные строки и напечатайте результат.
>>> df.drop(index=drop_idx)
Id Datetime Drug
0 66531 2012-12-18 08:31:00 acetaminophen-HYDROcodone
1 66531 2012-12-18 17:44:00 acetaminophen-HYDROcodone
6 66531 2013-02-19 17:33:00 oxyCODONE
7 66531 2013-02-19 19:20:00 acetaminophen-HYDROcodone
8 66531 2013-02-19 20:54:00 methadone
9 66531 2013-02-20 06:46:00 methadone
10 66531 2013-02-20 13:21:00 methadone
11 66531 2013-02-20 22:18:00 methadone
В CLR через C # Рихтер объясняет, что:
Специальный высокоприоритетный поток CLR предназначен для вызова
методов Finalize
(см. заголовок «Завершение внутренних устройств» главы 20)
Это единственный контекст, в котором он говорит о потоке сборщика мусора. Чуть ранее в этой главе он объясняет, что сборка мусора запускается в ответ на одно из следующих событий:
GC.Collect
... что говорит о том, что единственным потоком, созданным сборщиком мусора, является этот единственный, высокоприоритетный поток финализатора.
Редактировать : Затем он продолжает, в «Параллельной коллекции», чтобы объяснить, что:
В многопроцессорной системе, в которой запущена версия механизма исполнения для рабочей станции, сборщик мусора имеет дополнительный фоновый поток для одновременного сбора объектов во время работы приложения. [...] У сборщика мусора есть фоновый поток с обычным приоритетом, который помечает недоступные объекты.
The GC thread runs at a normal priority. The finalizer thread runs at "Highest" priority.
You can see this by turning on the Debug "Thread" window, and breaking anywhere in a managed application. The threads are all listed (although they're not named), with their priorities. It takes a bit to decipher which is which, but there will be an extra "Normal" and "Highest" priority thread, which correspond to the GC and the Finalizer thread.
сборщик мусора работает с более низким приоритетом, чем критические потоки
Приоритет потока GC - это деталь реализации, прямо сейчас они работают с нормальным приоритетом, однако поток финализатора работает с высоким приоритетом и также имеет тайм-аут.