#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)