如何从我的数据帧中获得最多的对?

2024-06-07 13:05:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,它为每一行显示一个人对(name_1和name_2)以及相应的分数。分数是一个数值,表示这两个人在一起的配合程度。分数越高,人1(name_1)和人2(name_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 

我不确定这是否也是我能得到的最大对数。如果你知道如何得到最好的对(见上文)或对的最大数量,我真的很高兴看到。你知道吗


Tags: 数据name分数数值rickmaryjacobrock
1条回答
网友
1楼 · 发布于 2024-06-07 13:05:44

编辑 与此同时,我发现了一个非常方便的函数,可以从数据帧创建一个图,但是您应该将列score重命名为weight
你可以简单地写下:

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

就这样。
Rest仍然是我们下面讨论的一部分,您如何进一步处理结果。。。


我的方法是

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      

文档来源:
为了设置图表,您已经有了正确的链接。
有关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

相关问题 更多 >

    热门问题