2016-06-23 7 views
0

У меня есть следующий dataframe:Создание новых столбцов на основе нескольких условий в Python

data = [ 
(27450, 27450, 29420,"10/10/2016"), 
(29420 , 36142, 29420, "10/10/2016"), 
(11 , 11, 27450, "10/10/2016")] 

#Create DataFrame base 
df = pd.DataFrame(data, columns=("User_id","Actor1","Actor2", "Time")) 

Первый столбец содержит user_id, и каждая строка представляет одно действие, которое он делает. Каждый user_id отображается в столбце «Actor1» или «Actor2».

Во-первых, я хотел бы создать новый столбец, где он будет присваивать значение 1, если user_id находится в столбце «Actor1» и 0 в противном случае.

Во-вторых, я хотел бы создать новый столбец, где для каждого user_id будет храниться значение «Актер» _i, с которым он взаимодействовал.

Для приведенного выше примера, вывод будет выглядеть следующим образом:

Col1 Col2  
    1 29420  
    0 36142  
    1 27450  

Что является наиболее эффективным вещий способ сделать это?

Большое спасибо!

+0

является необходимым, если user_id находится в actor1 колонке, она будет находиться в той же строке? – hashcode55

ответ

2
import numpy as np 
import pandas as pd 

data = [(27450, 27450, 29420,"10/10/2016"), 
     (29420 , 36142, 29420, "10/10/2016"), 
     (11 , 11, 27450, "10/10/2016")] 
df = pd.DataFrame(data, columns=("User_id","Actor1","Actor2", "Time")) 
mask = (df['User_id'] == df['Actor1']) 
df['first actor'] = mask.astype(int) 
df['other actor'] = np.where(mask, df['Actor2'], df['Actor1']) 
print(df) 

User_id Actor1 Actor2  Time first actor other actor 
0 27450 27450 29420 10/10/2016   1  29420 
1 29420 36142 29420 10/10/2016   0  36142 
2  11  11 27450 10/10/2016   1  27450 

Сначала создайте булеву маску, которая Правда, когда User_id равна Actor1:

In [51]: mask = (df['User_id'] == df['Actor1']); mask 
Out[51]: 
0  True 
1 False 
2  True 
dtype: bool 

Преобразование mask в Интс создает первый столбец:

In [52]: mask.astype(int) 
Out[52]: 
0 1 
1 0 
2 1 
dtype: int64 

Затем использовать np.where для выбора между двумя значениями. np.where(mask, A, B) возвращает массив, значение которого ith равно A[i], если mask[i] is True, и B[i] в противном случае. Таким образом, np.where(mask, df['Actor2'], df['Actor1']) принимает значение от Actor2 где mask истинно, и значение из Actor1 иначе:

In [53]: np.where(mask, df['Actor2'], df['Actor1']) 
Out[53]: array([29420, 36142, 27450]) 
+2

'pandas.Series.where' удалит необходимость импортировать numpy:' df ['Actor2']. Где (mask, df ['Actor1']). –

0

Heres мое решение - я предположил, что если идентификатор появляется в колонке actor1 его не нужно, это будет в одном ряду ...

df["Col1"] = [1 if i in df["Actor1"].values else 0 for i in df["User_id"].values] 
df["Col2"] = [df.iloc[i]["Actor2"] if j == 1 else df.iloc[i]["Actor1"] for i, j in enumerate(df["Col1"].values)] 

Выход -

User_id Actor1 Actor2  Time Col1 Col2 
0 27450 27450 29420 10/10/2016  1 29420 
1 29420 36142 29420 10/10/2016  0 36142 
2  11  11 27450 10/10/2016  1 27450 
Смежные вопросы