Как получить наибольшее количество пар из моего кадра данных панд? - PullRequest
0 голосов
/ 23 января 2019

У меня есть фрейм данных, который показывает для каждой строки пару людей (name_1 и name_2) вместе с соответствующей оценкой. Оценка представляет собой числовое значение и показывает, насколько хорошо эти два человека сочетаются друг с другом. Чем выше оценка, тем лучше совпадение между человеком 1 (имя_1) и человеком 2 (имя_2).

Как видите, некоторые имена можно найти дважды или более. Конечно, один человек может быть сопоставлен только один раз. Моя цель - найти как можно больше пар в фрейме данных и записать каждую из них во второй фрейм.

Проблема, которая заставляет меня бороться, заключается в следующем:

Я думаю, что могу получить макс. 8 пар из фрейма данных, так как у меня есть 8 разных имен в первом столбце. К сожалению, баллы за лучшие матчи четко не разделены. Один человек может совпадать с несколькими другими, тогда как другие могут совпадать только с одним конкретным человеком. Меня не очень интересует оценка соответствия. Я заинтересован в том, чтобы не потерять ни одного человека из-за плохого выбора парной комбинации.

Я ищу способ найти и извлечь как можно больше пар данных.

Это фрейм данных df:

      name_1     name_2  score
27      allen      jolly    1.8
23       anna       rock    2.8
22       anna  christina    1.1
26  christina       rock    2.3
24  christina      allen    1.4
25  christina      jolly    1.4
18      emily       rock    3.7
15      emily  sabastein    3.3
16      emily       anna    2.5
17      emily  christina    2.4
4       jacob      jolly    3.4
1       jacob       rick    2.9
3       jacob      allen    2.4
0       jacob       mary    2.3
2       jacob  christina    2.0
7        mary      jolly    1.7
5        mary       rick    1.4
6        mary  christina    1.3
14       rick       rock    2.8
9        rick  sabastein    2.8
8        rick      emily    2.5
13       rick      jolly    2.3
11       rick  christina    2.1
10       rick       anna    2.0
12       rick      allen    1.5
21  sabastein       rock    3.6
19  sabastein       anna    2.8
20  sabastein  christina    1.9

Я думаю, что наилучшее совпадение с точки зрения общего максимального балла:

emely       rock        3.7
jacob       jolly       3.4
sabastein   anna        2.8
rick        allen       1.5
mary        christina   1.3 

Я не совсем уверен, что это также максимальное количество пар, которое я могу получить. Если вы знаете, как получить лучшие пары (см. Выше) или максимальное количество пар, я был бы очень рад видеть.

1 Ответ

0 голосов
/ 24 января 2019

EDIT
Тем временем я нашел очень удобную функцию для создания графика из кадра данных, но вы должны переименовать ваш столбец с score на weight для этого:
Вы можете просто написать:

G = nx.from_pandas_edgelist(df, 'name_1', 'name_2', 'weight')
mate = nx.max_weight_matching(G)

и все тут.
( Отдых по-прежнему является частью нашего обсуждения ниже, как вы будете обрабатывать результат дальше ... )


Мой подход будет

import pandas as pd
import networkx as nx

df['edges'] = df.apply(lambda r: (r.name_1, r.name_2, {'weight': r.score}), axis=1)

G = nx.Graph()

allnames = set(df.loc[:, ['name_1', 'name_2']].values.flatten())

for s in allnames:
    G.add_node(s)
G.add_edges_from(df.edges)

mate = nx.max_weight_matching(G)

Результат:

res = pd.DataFrame(list(mate), columns=['name_1', 'name_2'])
res['score'] = res.apply(lambda r: G[r[0]][r[1]]['weight'], axis=1)

print(res)
print(f'\nMatchings: {len(res)}\nTotal Score: {res.score.sum():.1f}')            

#      name_1     name_2  score
#0       rock      emily    3.7                            
#1       rick  christina    2.1                          
#2       mary      jacob    2.3                            
#3  sabastein       anna    2.8                           
#4      jolly      allen    1.8                                             
#Matchings: 5                                                
#Total Score: 12.7      

DocSources:
Для настройки Графика у вас уже была правильная ссылка.
Для функции maximum_matching см. Здесь https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.algorithms.matching.max_weight_matching.html#networkx.algorithms.matching.max_weight_matching

...