2016-10-29 3 views
2
의 특정 컬럼에 대한 공통의 가치가

나는 두 DataFrames은 다음과 같이 구성했다 :팬더 두 가지 dataframes

user_id movie_id rating 
438  588   5 
758  588   5 
913  588   5 
1024 588   5 
1214 588   5 

user_id movie_id rating 
45  3578  3 
321  3578  3 
467  3578  3 
758  3578  3 
1024 3578  3 
1381 3578  3 

list에서 분리하는 팬더 - 기본 방법이 나타납니다 user_id에 대한 값 두 DataFrames?

위의 예를 들어, 예상되는 출력은 다음과 같습니다

[758, 1024] 

-

참고 : 데이터 과학 스택 교환 부트 스트랩 돕기 위해,이 질문에 대한 자세한 배경으로 게시되어 있습니다 datascience.stackexchange.com - by answering directly there

+0

노트 대하여 : http://meta.stackexchange.com/questions/64068/is-cross- 멀티 스택 교환 사이트에서의 질문 올리기 – ayhan

+0

@ayhan 이것은 단지 dsse로 광고하는 방법입니다 :) - 좋은 답변을 원한다면 게시했을 것입니다. SO에만 – Jivan

답변

2

: aa 적어도 내 노트북에 (

In [277]: np.intersect1d(a.user_id, b.user_id).tolist() 
Out[277]: [758, 1024] 

또는 pd.core.common.intersection() 방법을하지만, 속도가 느린 것으로 보인다 bb 데이터 프레임 [아래 설정 참조) :

In [307]: pd.core.common.intersection(a.user_id, b.user_id).tolist() 
Out[307]: [1024, 758] 

aa DF (50K 행) 및 bb DF위한 타이밍 (60K 행)

In [294]: aa = pd.concat([a] * 10**4, ignore_index=True) 

In [295]: bb = pd.concat([b] * 10**4, ignore_index=True) 

In [296]: aa.shape 
Out[296]: (50000, 3) 

In [297]: bb.shape 
Out[297]: (60000, 3) 

In [298]: %timeit aa.ix[aa.user_id.isin(bb.user_id),'user_id'].tolist() 
10 loops, best of 3: 41.8 ms per loop 

In [299]: %timeit np.intersect1d(aa.user_id, bb.user_id).tolist() 
100 loops, best of 3: 5.36 ms per loop 

In [300]: %timeit pd.merge(aa, bb, on='user_id').user_id.tolist() 
... 
skipped 
... 
MemoryError: 

In [308]: %timeit pd.core.common.intersection(aa.user_id, bb.user_id).tolist() 
10 loops, best of 3: 52.8 ms per loop 
+0

당신은 첫 번째 해결책을 생략 - 타이밍을 추가 할 수 있습니까? – jezrael

+0

@jezrael, 내 노트에 달려 있습니다 :) – MaxU

+1

괜찮습니다. Btw, 그것은 당신을 위해 실패 병합하는 것이 흥미 롭습니다 :) 그리고 numpy 솔루션은 분명히 빠릅니다. ;) – jezrael

1

당신은 isin을 사용할 수 있습니다 성장이 사이트를 도와주세요 당신은 또한 DSSE의 사용자 인 경우 :

print (df1.user_id.isin(df2.user_id)) 
0 False 
1  True 
2 False 
3  True 
4 False 
Name: user_id, dtype: bool 

print (df1[df1.user_id.isin(df2.user_id)]) 
    user_id movie_id rating 
1  758  588  5 
3  1024  588  5 

print (df1.ix[df1.user_id.isin(df2.user_id),'user_id']) 
1  758 
3 1024 
Name: user_id, dtype: int64 

print (df1.ix[df1.user_id.isin(df2.user_id),'user_id'].tolist()) 
[758, 1024] 

merge 또 다른 해결 방법 : numpy.intersect1d() 방법을 사용할 수 있습니다

print (pd.merge(df1,df2, on='user_id').user_id.tolist()) 
[758, 1024]