Я работаю над соответствующими названиями компаний, и у меня есть фрейм данных, который возвращает вывод в формате ниже.
Таблица имеет исходное имя, и для каждого исходного имени может быть N совпадений. Для каждого совпадения есть 3 столбца: match_name_0, score_0, match_index_0 и так далее до match_name_N.
Я пытаюсь найти способ вернуть новый фрейм данных, который сортирует столбцы после original_name по наибольшему количеству совпадений. По сути, если бы match_score_2 был самым высоким, то match_score_0, за которым следует match_score_1, столбцы были бы
original_score, match_name_2, match_score_2, match_index_2, match_name_0, match_score_0, match_index_0, match_name_2, match_score_2, match_index_2,
В случае ничьей крайний левый матч должен иметь более высокий рейтинг. Я должен отметить, что иногда они будут в правильном порядке, но в 30-40% случаев это не так.
Я смотрел на свой экран в течение 2 часов и полностью озадачен, поэтому любая помощь очень ценится
Я предполагаю, что вы хотите установить порядок совпадений сначала по score
, а затем по match_number
индивидуально для каждого original_name
.
С большими наборами данных обычно трудно иметь дело, включая этот случай. Я предлагаю изменить форму на длинный набор данных, где вы можете легко навязать требуемый порядок с помощью
sort_values(by=['original_name','score','match_number'], ascending=[True,False,True])
Наконец, вы можете преобразовать его обратно в широкий набор данных.
import pandas as pd
from io import StringIO
# sample data
df = """
original_name,match_name_0,score_0,match_index_0,match_name_1,score_1,match_index_1,match_name_2,score_2,match_index_2,match_name_3,score_3,match_index_3,match_name_4,score_4,match_index_4
aberdeen asset management plc,aberdeen asset management sa,100,2114,aberdeen asset management plc esop,100,2128,aberdeen asset management inc,100,2123,aberdeen asset management spain,71.18779356,2132,aberdeen asset management ireland,69.50514818,2125
agi partners llc,agi partners llc,100,5274,agi partners llc,100,5273,agr partners llc,57.51100704,5378,aci partners llc,53.45090217,3097,avi partners llc,53.45090217,17630
alberta investment management corporation,alberta investment management corporation,100,6754,alberta investment management corporation pension arm,100,6755,anchor investment management corporation,17.50748486,10682,cbc investment management corporation,11.79760839,36951,harvest investment management corporation,31.70316571,85547
"""
df= pd.read_csv(StringIO(df.strip()), sep=',', engine='python')
# wide to long
result = pd.wide_to_long(df, ['match_name','score','match_index'], i='original_name', j='match_number', sep='_').reset_index()
# sort matches as per requirement
result = result.sort_values(by=['original_name','score','match_number'], ascending=[True,False,True])
# overwrite ranking imposed by previous sort
# this ensures that the order is maintained once it is
# reshaped back to a wide dataset
result['match_number'] = result.groupby('original_name').cumcount()
# reshape long to wide
result = result.set_index(['original_name','match_number']).unstack()
# tidy up to match expected result
result = result.swaplevel(axis=1).sort_index(axis=1)
result = result.reindex(['match_name','score','match_index'], axis=1, level=1)
result.columns = [f'{col[1]}_{col[0]}' for col in result.columns]
В результате, например, предыдущее совпадение 4 из alberta investment management corporation
теперь соответствует совпадению 2 (на основе счета). Порядок совпадений 3 и 4 для agi partners llc
остается прежним, потому что они имеют одинаковый счет.
Да, это будет работать для любого количества матчей.
одна быстрая вещь, которую я только что заметил. когда вы переименовываете столбцы, вы перебираете результаты. столбцы. Будет ли этот код работать, если пользователь запросит 10 возможных совпадений вместо 5?