Я бы пошла об этом немного по-другому, может быть, использовать словарь и хранить ваши сообщения. Что-то вроде этого:
Dictionary<string, string> messages = new Dictionary<string, string>();
for(int i = 1; i <= 3; i++)
{
messages.Add("message" + i.ToString(), i.ToString());
}
Вот то, что я придумал:
import pandas
df = pandas.read_csv('test.tsv', header=None, sep='\s+',
parse_dates = [['date', 'time']],
names=['patient_id', 'date', 'time','drug'])
to_drop = set()
for _, patient in df.groupby('patient_id'):
meth_times = patient.loc[patient['drug'] == 'methadone']['date_time']
morph_doses = patient.loc[patient['drug'] == 'morphine']
for i, md in morph_doses.iterrows():
for mt in meth_times:
days_elapsed = (mt - md['date_time']).days
if days_elapsed < 1:
to_drop.add(i)
break
df = df[~df.index.isin(to_drop)]
Как и в случае с предложенным @ulmefors ответом, он многократно повторяется по каждой строке морфина / метадона, поэтому он несколько неэффективен, но если вы не работаете с огромным набором данных он должен выполнить работу достаточно быстро, чтобы это было незначительным. (Но в отличие от другого ответа, он повторяется только несколько раз в дозах морфина / метадона каждого пациента, а не через все возможные комбинации строк)
>>> 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