Назначение значения столбца на основе нескольких условий столбца в python
У меня есть фрейм данных pandas, который структурирован как таковой,
ID Col1 Col2
1 50 12:23:01
1 34 12:25:11
1 65 12:32:25
1 98 12:45:08
2 23 11:09:10
2 12 11:12:43
2 56 11:13:12
2 34 11:14:26
2 77 11:16:02
3 64 14:01:11
3 34 14:01:13
3 48 14:02:32
Что мне нужно, так это иметь возможность искать в повторяющемся значении ID
, чтобы найти условие в столбце 1, скажем Col1==34
. Исходя из этого, мне нужно создать новый столбец Col3
, который принимает соответствующее значение в Col2
. Конечный результат, который мне нужен, показан ниже.
ID Col1 Col2 Col3
1 50 12:23:01 12:25:11
1 34 12:25:11 12:25:11
1 65 12:32:25 12:25:11
1 98 12:45:08 12:25:11
2 23 11:09:10 11:14:26
2 12 11:12:43 11:14:26
2 56 11:13:12 11:14:26
2 34 11:14:26 11:14:26
2 77 11:16:02 11:14:26
3 64 14:01:11 14:01:13
3 34 14:01:13 14:01:13
3 48 14:02:32 14:01:13
Я попробовал следующее, Но это не вытягивание отдельного значения Col2
, а просто дублирование Col2
df['Col3'] = np.where(df.Col1.isin(df[df.Col2==34].Col1), df['Col2'], 0)
Я понимаю, что назначение df['Col2']
else 0 из условия where, скорее всего, является моей логической проблемой, и что, вероятно, есть какой-то простой краткий способ сделать это (или что мое время может быть лучше потрачено на SQL), но я не уверен, как это настроить. Заранее спасибо.
3 ответа:
Использование
query
+map
df['Col3'] = df.ID.map(df.query('Col1 == 34').set_index('ID').Col2) print(df) ID Col1 Col2 Col3 0 1 50 12:23:01 12:25:11 1 1 34 12:25:11 12:25:11 2 1 65 12:32:25 12:25:11 3 1 98 12:45:08 12:25:11 4 2 23 11:09:10 11:14:26 5 2 12 11:12:43 11:14:26 6 2 56 11:13:12 11:14:26 7 2 34 11:14:26 11:14:26 8 2 77 11:16:02 11:14:26 9 3 64 14:01:11 14:01:13 10 3 34 14:01:13 14:01:13 11 3 48 14:02:32 14:01:13
работа с дубликатами
# keep first instance df.ID.map(df.query('Col1 == 34') \ .drop_duplicates(subset=['ID']).set_index('ID').Col2)
Или
# keep last instance df.ID.map(df.query('Col1 == 34') \ .drop_duplicates(subset=['ID'], keep='last').set_index('ID').Col2)