2016-09-20 6 views
2

내가 가진 내가 DF2 dataframes SYM1 열에서 sym2 열 값을 사용할 수 여부를 확인하려면한 데이터 프레임의 열 값을 확인하거나 다른 데이터 프레임의 열을 확인하는 방법은 무엇입니까?

 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 

출력 -

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 
이 dataframes-

. sym2 열의 기호를 사용할 수없는 경우 sym1 열에서 사용할 수없는 기호 목록을 원합니다. 모든 기호를 사용할 수 있으면 목록이 비어 있어야합니다.

예상 결과 -

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

그것은 동일합니다 :'123 : % timeit ((df2.ix [~ df2.sym2.isin (df1.sym1), 'sym2']. tolist()))' '100 개의 루프, 3의 최상 : 루프 당 3.22 msec ' - '[124]에서 : % timeit (list (df2.ix [df2.sym2.isin (df1.sym1),'sym2 ']))' ' 3 : 루프 당 3.22 msec @ – 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) 

또는 바닐라 파이썬 목록으로 17,451,515,: 700K와 500K DFS에 대한

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

관련 문제