2017-01-26 2 views
1

У меня есть следующие dataframes:Панды Сравнение двух dataframes и определить, совпавшего значения от

print(dfa) 

ID        Value 
AA12 101 BB101 CC01 DE06  1 
AA11 102 BB101 CC01 234 EE07 2 
AA10 202 BB101 CC01 345 EE09 3 
AA13 103 BB101 CC02 123  4 
AA14 203 BB101 CC02 456  5 
AA15 204 BB102 CC03 567  6 


print(dfb) 

ID        Value 
AA10 202 BB101 CC01 EE09 345 3 
AA11 102 BB101 CC01 EE07 234 2 
AA12 101 BB101 CC01 DE06  1 
AA13 103 BB101 CC02 123  4 
AA18 203 BB103 CC01 456  5 
AA15 204 BB201 CC11 678  7 

Я хотел бы сравнить строку в (dfa.ID, dfa.Value) к одному из (dfb.ID , dfb.Value). Если они точно совпадают (даже если порядок подстроки не идентичен), я бы хотел напечатать «Да» на новом «Идентификатор соответствия»? и «Соответствие ценности»? столбцы в dataframe 'dfa'.

Желаемый результат будет:

ID        Value ID Matched? Value Matched? 
AA12 101 BB101 CC01 DE06  1  Yes   Yes 
AA11 102 BB101 CC01 234 EE07 2  Yes   Yes 
AA10 202 BB101 CC01 345 EE09 3  Yes   Yes 
AA13 103 BB101 CC02 123  4  Yes   Yes 
AA14 203 BB101 CC02 456  5  No   Yes 
AA15 204 BB102 CC03 567  6  No   No 
+0

Вы не можете сделать «печать DFA = = dfb " –

+0

Вы сами пробовали? У вас возникли проблемы? –

+0

@AdamHughes Я попробовал это раньше. Возвращено «Может только сравнивать идентично помеченные объекты DataFrame» на моем исходном фрейме. – comproch

ответ

1

вы можете сделать что-то похожее на это:

In [40]: pd.merge(a.assign(x=a.ID.str.split().apply(sorted).str.join(' ')), 
    ...:   b.assign(x=b.ID.str.split().apply(sorted).str.join(' ')), 
    ...:   on=['x','Value'], 
    ...:   how='outer', 
    ...:   indicator=True) 
    ...: 
Out[40]: 
          ID_x Value        x \ 
0  AA12 101 BB101 CC01 DE06  1  101 AA12 BB101 CC01 DE06 
1 AA11 102 BB101 CC01 234 EE07  2 102 234 AA11 BB101 CC01 EE07 
2 AA10 202 BB101 CC01 345 EE09  3 202 345 AA10 BB101 CC01 EE09 
3  AA13 103 BB101 CC02 123  4  103 123 AA13 BB101 CC02 
4  AA14 203 BB101 CC02 456  5  203 456 AA14 BB101 CC02 
5  AA15 204 BB102 CC03 567  6  204 567 AA15 BB102 CC03 
6       NaN  5  203 456 AA18 BB103 CC01 
7       NaN  7  204 678 AA15 BB201 CC11 

          ID_y  _merge 
0  AA12 101 BB101 CC01 DE06  both 
1 AA11 102 BB101 CC01 EE07 234  both 
2 AA10 202 BB101 CC01 EE09 345  both 
3  AA13 103 BB101 CC02 123  both 
4       NaN left_only 
5       NaN left_only 
6  AA18 203 BB103 CC01 456 right_only 
7  AA15 204 BB201 CC11 678 right_only 

Объяснение:

In [43]: a.ID.str.split() 
Out[43]: 
0   [AA12, 101, BB101, CC01, DE06] 
1 [AA11, 102, BB101, CC01, 234, EE07] 
2 [AA10, 202, BB101, CC01, 345, EE09] 
3   [AA13, 103, BB101, CC02, 123] 
4   [AA14, 203, BB101, CC02, 456] 
5   [AA15, 204, BB102, CC03, 567] 
Name: ID, dtype: object 

In [44]: a.ID.str.split().apply(sorted) 
Out[44]: 
0   [101, AA12, BB101, CC01, DE06] 
1 [102, 234, AA11, BB101, CC01, EE07] 
2 [202, 345, AA10, BB101, CC01, EE09] 
3   [103, 123, AA13, BB101, CC02] 
4   [203, 456, AA14, BB101, CC02] 
5   [204, 567, AA15, BB102, CC03] 
Name: ID, dtype: object 

In [45]: a.assign(x=a.ID.str.split().apply(sorted).str.join(' ')) 
Out[45]: 
          ID Value        x 
0  AA12 101 BB101 CC01 DE06  1  101 AA12 BB101 CC01 DE06 
1 AA11 102 BB101 CC01 234 EE07  2 102 234 AA11 BB101 CC01 EE07 
2 AA10 202 BB101 CC01 345 EE09  3 202 345 AA10 BB101 CC01 EE09 
3  AA13 103 BB101 CC02 123  4  103 123 AA13 BB101 CC02 
4  AA14 203 BB101 CC02 456  5  203 456 AA14 BB101 CC02 
5  AA15 204 BB102 CC03 567  6  204 567 AA15 BB102 CC03 
+0

Я хотел бы установить «AA13 103 BB101 CC02 123» и «AA13 103 BB101 CC02», равные друг другу. Как мне это сделать? Спасибо за помощь! – comproch

+0

@ comprocho, не могли бы вы открыть новый вопрос, пожалуйста? Этот ответ уже довольно большой. Я не хочу перегружать его ... Пожалуйста, не забудьте указать логику сравнения. Будет ли «AA13» 'равно« 103 BB101 AA13 CC02 »? – MaxU

+0

Пожалуйста, найдите новый вопрос [здесь] (http://stackoverflow.com/questions/42032326/compare-two-dataframes-and-filter-the-matched-values). Спасибо! – comproch