2016-09-20 7 views
2

私は2 dataframes-あるデータフレーム内の列の値を他のデータフレームの列内で使用可能かどうかチェックする方法はありますか?

df1_data = {'sym1' :{0:'abc a01',1:'pqr q02',2:'xyz y03',3:'mno o12',4:'lmn l45'}} 
df1 = pd.DataFrame(df1_data) 
print df1 

df2_data = {'sym2' :{0:'abc a01',1:'xxx p0',2:'xyz y03',3:'mno o12',4:'lmn l45',5:'rrr r1',6:'kkk k3'}} 
df2 = pd.DataFrame(df2_data) 
print df2 

出力 -

 sym1 
0 abc a01 
1 pqr q02 
2 xyz y03 
3 mno o12 
4 lmn l45 
     sym2 
0 abc a01 
1 xxx p0 
2 xyz y03 
3 mno o12 
4 lmn l45 
5 rrr r1 
6 kkk k3 

を持っている私は、DF2データフレームSYM1列では使用できませんかSYM2列の値を確認したいです。 sym2カラムのシンボルが利用できない場合、sym1カラムでは利用できないシンボルのリストが必要です。すべてのシンボルが使用可能な場合、リストは空でなければなりません。

期待Result-

list -> ['xxx p0','rrr r1','kkk k3'] 

答えて

4

その後、ixによって選択し、tolistによってlistに変換、isinboolean indexingを使用することができます。ここでは

print (~df2.sym2.isin(df1.sym1)) 
0 False 
1  True 
2 False 
3 False 
4 False 
5  True 
6  True 
Name: sym2, dtype: bool 

print (df2.ix[~df2.sym2.isin(df1.sym1), 'sym2']) 
1 xxx p0 
5 rrr r1 
6 kkk k3 
Name: sym2, dtype: object 

print (df2.ix[~df2.sym2.isin(df1.sym1), 'sym2'].tolist()) 
['xxx p0', 'rrr r1', 'kkk k3'] 
+0

。私はこのリストを使用しています(df2 [〜df2.sym2.isin(df1.sym1)]。sym2)。高速実行と比較してどれが最適ですか? – kit

+0

それは同じです: 'In [123]:%timeit(df2.ix [〜df2.sym2.isin(df1.sym1)、 'sym2']。tolist()))' '100ループ、3のベスト:ループごとに3.22ミリ秒 ' - ' [124]:%timeit(list(df2.ix [〜df2.sym2.isin(df1.sym1)、 'sym2'])) ' ' 3:ループあたり3.22ミリ秒」 – jezrael

+0

@ jezrael- okもう一度ありがとう。 – kit

1

を別の、より高速なビット、解決策:

In [54]: df2.set_index('sym2').index.difference(df1.set_index('sym1').index).values 
Out[54]: array(['kkk k3', 'rrr r1', 'xxx p0'], dtype=object) 

やバニラPythonのリストとして:700Kと500KのDF用

In [74]: df2.set_index('sym2').index.difference(df1.set_index('sym1').index).values.tolist() 
Out[74]: ['kkk k3', 'rrr r1', 'xxx p0'] 

タイミング:私も結果を得たjezrael- @

In [55]: df1 = pd.concat([df1] * 10**5, ignore_index=True) 

In [57]: df2 = pd.concat([df2] * 10**5, ignore_index=True) 

In [58]: df1.shape 
Out[58]: (500000, 1) 

In [59]: df2.shape 
Out[59]: (700000, 1) 

In [67]: %timeit df2.set_index('sym2').index.difference(df1.set_index('sym1').index).values 
10 loops, best of 3: 123 ms per loop 

In [68]: %timeit df2.ix[~df2.sym2.isin(df1.sym1), 'sym2'] 
1 loop, best of 3: 216 ms per loop 

In [72]: %timeit df2.set_index('sym2').index.difference(df1.set_index('sym1').index).values.tolist() 
10 loops, best of 3: 123 ms per loop 
+0

ニースのソリューションですが、重複がある場合は、私とあなたのソリューションで出力が異なります(それは良いことも悪いも、OPに依存します)。また、注文が変更されます。 – jezrael

+0

@ MaxU-もう一つのソリューションを提供していただきありがとうございます。 – kit