2016-06-23 4 views
0

で複数の条件に基づいて新しい列を作成します。私は、次のデータフレームを持っているの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"のいずれかの列に表示されます。

最初に、user_idが「Actor1」列にある場合は値1を割り当て、それ以外の場合は0を割り当てる新しい列を作成します。

第2に、新しいuser_idに対して、彼がやりとりした "Actor" _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_idActor1に等しいときはTrueであるブールマスクを作成する。そして

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

2つの値の間で選択するnp.whereを使用する:int型にmask変換

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

は、最初の列を作成します。 np.where(mask, A, B)は、mask[i]がTrueの場合はの値がA[i]、それ以外の場合はB[i]の配列を返します。したがって、 np.where(mask, df['Actor2'], df['Actor1'])maskがTrue Actor2の値、そうでなければ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

相続人は私のソリューション - 私は、ユーザーIDはその必要はない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 
関連する問題