2016-12-23 3 views
4

Я получил панд dataframe, которая строится как таковые,Присвоение значения столбца на основе нескольких столбцов в условиях питона

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'] еще 0 из где состояние, скорее всего, моя логическая проблема и что, вероятно, есть несколько простых способов сделать это (или что мое время может быть лучше потрачено на 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) 
+0

Цените это! Работала отлично. – rastrast

+0

На самом деле это работает с тестовым набором данных, но в моем фактическом наборе данных кажется, что у меня есть дублированные значения на основе ошибки: «Повторное обращение только с уникальными ценными объектами индекса». Я предполагаю, что мне придется сначала бросить дубликаты? – rastrast

+0

Это будет работать. Но вы хотите сделать первое наблюдение? – piRSquared

3

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

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

Вот на основе NumPy Векторизованным решения -

df['Col3'] = df.Col2.values[df.Col1.values == 34][df.ID.factorize()[0]] 
Смежные вопросы