2017-02-03 1 views
1

이전 질문 필터링 : 여기 이 dataframes을 비교하고 일치하는 값을

 ID        Value ID Matched? Value Matched? 
0 AA12 101 BB101 CC01 DD06  1  Yes   Yes 
1 AA12 101 BB101 CC01 DD06  2  Yes   Yes 
2 AA11 102 BB101 CC01 2341 DD07 2  Yes   Yes 
3 AA10 202 BB101 CC01 3451 DD09 3  Yes   Yes 
4 AA13 103 BB101 CC02 1231  4  No   Yes 
5 AA14 203 BB101 CC02 4561  5  Yes   No 

가 @MaxU에 의해 작성된 코드입니다 :

print(a) 

    ID        Value 
0 AA12 101 BB101 CC01 DD06  1 
1 AA12 101 BB101 CC01 DD06  2 
2 AA11 102 BB101 CC01 2341 DD07 2 
3 AA10 202 BB101 CC01 3451 DD09 3 
4 AA13 103 BB101 CC02 1231  4 
5 AA14 203 BB101 CC02 4561  5 
print(b) 

    ID        Value 
0 AA12 101 BB101 CC01 1351 DD06 1 
1 AA12 101 BB101 CC01 1351 DD06 2 
2 AA11 102 BB101 CC01 DD07  2 
3 AA10 202 BB101 CC01 3451 DD09 3 
4 AA13 103 BB101 CC02    4 
5 AA14 203 BB101 CC02 4561  6 

원하는 출력 : 나는 두 dataframes이 Pandas Compare two dataframes and determine the matched values

을 이전 게시물의 글 :

내가 달성하고자하는 어떤

: 하나 dataframes는 [ 'ID'] 에서 네 자리 항목을 포함하지 않는 경우

  • (즉 2341, 3451), 일치하는 프로세스에서 제외하고 싶습니다.
  • 동일한 ID가 두 번 이상 나타나는 경우 [ '값']에 다른 값이있을 수 있습니다.

이 코드의 결과는 here입니다. 불행히도 원하는 결과를 얻지 못합니다. 색인 3 만 일치합니다. 코드를 조정했지만 다음 단계를 파악할 수 없었습니다.

시간과 노력에 감사드립니다.

+1

전체 taframe은 ID에 4 자리 숫자가 없어야합니까? 또는 귀하의 예제에서 인덱스 0과 1과 같은 4 자리 패턴이없는 행만 제외 시키길 원하십니까? – Boud

+0

a.ID 또는 b.ID에 4 자리수가 포함되어 있지 않으면 해당 행의 ID에서 해당 ID를 제거하고 싶습니다. – comproch

답변

1

이 시도 :

모두 DFS에서

첫번째하자 분할 및 스택 ID 열 :

In [251]: no_match_idx = d1.loc[~d1.ID.isin(d2.ID), 'idx'].unique() 

In [252]: no_match_idx 
Out[252]: array([4], dtype=int64) 

In [253]: df1['Matched_ID'] = ~df1.index.isin(no_match_idx) 
    ...: df1['Matched_Value'] = df1.Value.isin(df2.Value) 

결과 :

In [254]: df1 
Out[254]: 
           ID Value Matched_ID Matched_Value 
0  AA12 101 BB101 CC01 DD06  1  True   True 
1  AA12 101 BB101 CC01 DD06  2  True   True 
2 AA11 102 BB101 CC01 2341 DD07  2  True   True 
3 AA10 202 BB101 CC01 3451 DD09  3  True   True 
4  AA13 103 BB101 CC02 1231  4  False   True 
5  AA14 203 BB101 CC02 4561  5  True   False 

In [248]: d1 = df1.set_index('Value').ID.str.split(expand=True).stack().to_frame('ID').reset_index().rename(columns={'level_1':'idx'}) 
    ...: d2 = df2.set_index('Value').ID.str.split(expand=True).stack().to_frame('ID').reset_index().rename(columns={'level_1':'idx'}) 

In [249]: d1 
Out[249]: 
    Value idx  ID 
0  1 0 AA12 
1  1 1 101 
2  1 2 BB101 
3  1 3 CC01 
4  1 4 DD06 
5  2 0 AA12 
6  2 1 101 
7  2 2 BB101 
8  2 3 CC01 
9  2 4 DD06 
10  2 0 AA11 
11  2 1 102 
12  2 2 BB101 
13  2 3 CC01 
14  2 4 2341 
15  2 5 DD07 
16  3 0 AA10 
17  3 1 202 
18  3 2 BB101 
19  3 3 CC01 
20  3 4 3451 
21  3 5 DD09 
22  4 0 AA13 
23  4 1 103 
24  4 2 BB101 
25  4 3 CC02 
26  4 4 1231 
27  5 0 AA14 
28  5 1 203 
29  5 2 BB101 
30  5 3 CC02 
31  5 4 4561 

In [250]: d2 
Out[250]: 
    Value idx  ID 
0  1 0 AA12 
1  1 1 101 
2  1 2 BB101 
3  1 3 CC01 
4  1 4 1351 
5  1 5 DD06 
6  2 0 AA12 
7  2 1 101 
8  2 2 BB101 
9  2 3 CC01 
10  2 4 1351 
11  2 5 DD06 
12  2 0 AA11 
13  2 1 102 
14  2 2 BB101 
15  2 3 CC01 
16  2 4 DD07 
17  3 0 AA10 
18  3 1 202 
19  3 2 BB101 
20  3 3 CC01 
21  3 4 3451 
22  3 5 DD09 
23  4 0 AA13 
24  4 1 103 
25  4 2 BB101 
26  4 3 CC02 
27  6 0 AA14 
28  6 1 203 
29  6 2 BB101 
30  6 3 CC02 
31  6 4 4561 

지금 우리가 'not matched' ID를 검색 할 수 있습니다

+0

최고의 솔루션! 스태킹에 대해서도 배웠습니다! 시간과 도움을 주셔서 대단히 감사합니다! – comproch

+1

@comprocho, 기꺼이 도와 드리겠습니다. :-) – MaxU

관련 문제