我计划和6个人一起去打高尔夫球,试着优化配对。我从组合的数量开始,然后随机抽样5轮。我的目标是创建行[a,B,c,d,e,f]与列[a,b,c,d,e,f]的交叉矩阵,然后找到最小化1数量的分组组合。
import pandas
from itertools import permutations, combinations
players = ['a','b','c','d','e','f']
z = pd.DataFrame(combinations(players,3)
for i in z.index:
players = ['a','b','c','d','e','f']
players.remove(z.loc[i,0])
players.remove(z.loc[i,1])
players.remove(z.loc[i,2])
z.loc[i,3] = players[0]
z.loc[i,4] = players[1]
z.loc[i,5] = players[2] #just to fill out the rest of the matrix
z =
0 1 2 3 4 5
0 a b c d e f
1 a b d c e f
2 a b e c d f
3 a b f c d e
4 a c d b e f
5 a c e b d f
6 a c f b d e
7 a d e b c f
8 a d f b c e
9 a e f b c d
v = z.sample(5)
opt = pd.DataFrame([], index = ['a','b','c','d','e','f'],columns = ['a','b','c','d','e','f'])
g = pd.concat([v[1].value_counts(),v[2].value_counts()]).sort_index().groupby(level = 0).sum() #pairings count for A
g
Out[116]:
b 3
c 1
d 1
e 3
f 2
有什么想法/功能可以帮助我吗?我可以在第1和第2列使用value_counts()来获得第一列,因为第0列总是'a',但不确定如何填写矩阵的其余部分。TIA!
解决方案如下所示:
a b c d e f
a 0 0.0 0.0 0.0 0.0 0.0
b 3 0.0 0.0 0.0 0.0 0.0
c 1 1 0.0 0.0 0.0 0.0
d 1 3 3 0.0 0.0 0.0
e 3 1 3 1 0.0 0.0
f 2 1 2 2 2 0.0
对于此示例
0 1 2 3 4 5
3 a b f c d e
2 a b e c d f
5 a c e b d f
1 a b d c e f
9 a e f b c d
1条答案
按热度按时间ubbxdtey1#
最后得到了这个解决方案:
本质上是创建所有分组组合的字符串,然后删除您正在查找的字母,然后从那里执行value_counts。超级混乱,但得到了我正在寻找的解决方案。关键字是sort_index().groupby(level = 0).sum()。从优化得分11开始,尝试最小化零的数量。