Объединить два больших фрейма данных в меньший мультиндексный фрейм данных в соответствии с совпадающими номерами строк?

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я использую recordlinkage для поиска совпадений между двумя фреймами данных разного размера, который выводит мультииндексный фрейм данных (features), содержащий соответствующий номер строки для совпадений в df_a в первом индексе (слева) и аналогично для df_b во втором индексе (справа). Я хочу объединить только совпадения, найденные в df_a и df_b, с правильным индексом в функциях, вот так:

df_a

       col_a col_b col_c
a           
b
c
d
e
  

df_b

       col_1 col_2 col_3
1           
2
3
4
5
6
7
8
9
10
  

возможности

                 match
   left  right 
    a     2      
          3
    b     7
          8
          9
  

В итоге получается
слияние 2

                match col_a col_b col_c col_1 col_2 col_3
   left  right 
    a     2      
          3
    b     7
          8
          9
  

Вот соответствующий фрагмент:

 for i in range(0,in_a_lines,chunks):
    if i < in_a_lines - chunks:
          df_a_subset = df_a.iloc[i:i chunks]
    else:
          df_a_subset = df_a.iloc[i:in_a_lines]

    indexer = recordlinkage.Index()
    indexer.block(left_on = [comp_left], right_on = [comp_right])
    pairs_subset = indexer.index(df_a_subset, df_b)

    comp = recordlinkage.Compare()
    comp.string(left_on = comp_left, right_on = comp_right, method='jarowinkler', threshold = 0.85)
    features = comp.compute(pairs_subset, df_a_subset, df_b).rename_axis(['left', 'right'])
    
    print(str(i chunks) "/" str(in_a_lines) "nPotential matches: " str(len(features)))


    merge1 = df_b.join(features, on=['right'])
    merge2 = df_a_subset.join(merge1, on = ['left'])
  
    merge2.to_csv(out_csv,
          header = None,
          index = None,
          mode='a',
          chunksize=chunks)                         
  

Комментарии:

1. Почему левый 1 соответствует правому 2 и 4?

2. ссылка на запись. Compare () принимает два фрейма данных с одним индексом и находит частичные совпадения строк, выводя мультиндексный фрейм данных, индексы которого определяются тем, где он нашел совпадение между этими двумя. В данном случае это означает, что запись в df_a строке 1 соответствовала записям в df_b строках 2 и 4. Я отредактирую это, чтобы было понятнее, что это два отдельных индекса.

Ответ №1:

Я просто перепутал порядок, левый фрейм данных должен вызвать объединение:

 merge1 = features.join(df_a_subset, on='left', how = 'inner')
merge2 = merge1.join(df_b, on='right', how = 'inner')
  

Если вы хотите удалить строки, содержащие условия соответствия recordlinkage, добавьте

 merge2 = merge2.drop(merge2.columns[[0,1]], axis=1)