Назначение значения столбца на основе нескольких условий столбца в 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   4  

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)

Воспользуйтесь преимуществами автоматического выравнивания индекса pandas, сделав id индекс. Затем просто добавьте столбец, основанный на логическом выборе. Этот ответ предполагает, что col1 уникален.

df.set_index('id', inplace=True)
df['col3'] = df.loc[df.col1 == 34, 'col2']

Вот векторное решение на основе NumPy -

df['Col3'] = df.Col2.values[df.Col1.values == 34][df.ID.factorize()[0]]