Попытка переупорядочить несколько столбцов в фрейме данных на основе значений строки ранжирования

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

Таблица имеет исходное имя, и для каждого исходного имени может быть 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 часов и полностью озадачен, поэтому любая помощь очень ценится

индекс original_name match_name_0 счет_0 match_index_0 match_name_1 счет_1 match_index_1 match_name_2 счет_2 match_index_2 match_name_3 счет_3 match_index_3 match_name_4 счет_4 match_index_4 0 абердин ассет менеджмент плс абердин управление активами са 100 2114 абердин ассет менеджмент плк esop 100 2128 абердин управление активами вкл. 100 2123 абердин управление активами испания 71.18779356 2132 абердин управление активами ирландия 69.50514818 2125 2 аги партнеры ООО аги партнеры ООО 100 5274 аги партнеры ООО 100 5273 агр партнеры ООО 57.51100704 5378 аси партнеры ООО 53.45090217 3097 ави партнеры ООО 53.45090217 17630 3 альберта корпорация управления инвестициями альберта корпорация управления инвестициями 100 6754 пенсионное отделение корпорации управления инвестициями альберты 100 6755 якорная корпорация по управлению инвестициями 17.50748486 10682 корпорация управления инвестициями cbc 11.79760839 36951 корпорация по управлению инвестициями урожая 31.70316571 85547
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что вы хотите установить порядок совпадений сначала по 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?

novawaly 08.02.2023 21:10

Да, это будет работать для любого количества матчей.

harryhaller 08.02.2023 22:35

Другие вопросы по теме