Панды: удалить строки на основе значения другой строки

Я бы пошла об этом немного по-другому, может быть, использовать словарь и хранить ваши сообщения. Что-то вроде этого:

 Dictionary<string, string> messages = new Dictionary<string, string>();
 for(int i = 1; i <= 3; i++)
 {
      messages.Add("message" + i.ToString(), i.ToString());
 }
2
задан Teddy 27 February 2019 в 19:42
поделиться

2 ответа

Вот то, что я придумал:

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 ответом, он многократно повторяется по каждой строке морфина / метадона, поэтому он несколько неэффективен, но если вы не работаете с огромным набором данных он должен выполнить работу достаточно быстро, чтобы это было незначительным. (Но в отличие от другого ответа, он повторяется только несколько раз в дозах морфина / метадона каждого пациента, а не через все возможные комбинации строк)

0
ответ дан J. Taylor 27 February 2019 в 19:42
поделиться
>>> 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
0
ответ дан ulmefors 27 February 2019 в 19:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: