我通过将 'name'
作为标识人的关键字来进行了添加。
方法
我的方法是对值进行评分,然后根据给定条件过滤最终的成对结果。
厨房评分
我们使用以下评分标准:
- 个人没有厨房:0
- 个人有厨房:1
- 个人有厨房但只在紧急情况下使用:0.5
厨房条件逻辑
我们检查[记录1的厨房评分] + [记录2的厨房评分]是否大于零。如下情况将出现:
- 两个成员均没有厨房(总和为0)[不符合 > 0 条件]
- 两个成员都有厨房(总和为2)
- 一个成员有厨房,另一个没有厨房(总和为1)
- 两个成员都有应急厨房(总和为1)
- 一个成员有应急厨房,另一个有厨房(总和为1.5)
- 一个成员有应急厨房,另一个没有厨房(总和为0.5)
食品评分
我们使用以下食品评分:
- food = 0 --> 肉食者 : -1
- food = 1 --> 不重要 : 0
- food = 2 --> 素食主义者 : 1
- food = 3 --> 素食者 : 1
食品条件逻辑
我们检查 *[记录1的食品评分] x [记录2的食品评分]* 是否大于或等于 零 。如下情况将出现:
- 两个成员都是肉食者:-1 x -1 = 1 [包含]
- 其中一位成员是肉食者,另一位是素食主义者或素食者:-1 x 1 = -1 [不包含]
- 其中一位成员是肉食者,另一位不在意:-1 x 0 = 0 [包含]
- 其中一位成员是素食主义者或素食者,另一位不在意:1 x 0 = 0 [包含]
- 两个成员均为素食主义者或素食者:1 x 1 = 1 [包含]
年龄组评分
为了对年龄组进行评分,我们为不同的组分配了一些值:
- 10-18 :1
- 18-22 :2
- 22-26 :3
- 26-29 :4
- 29-34 :5
- 34-40 :6
- 40-45 :7
- 45-55 :8
- 55-75 :9
年龄分数计算方法
计算年龄分数采用以下公式:age_score = round((1 - (abs(个人1所在年龄组值 - 个人2所在年龄组值) / 10)), 2)
以上公式的计算步骤如下:
- 首先我们计算两个人年龄组的值之间的差的绝对值。
- 然后我们将其除以10进行归一化处理。
- 接着从1中减去这个值来反转距离,因此在此步骤之后,相似或更接近年龄组的人具有较高的值,而不同或更远的年龄组的人的值较低。
情况如下:
- 18-22和18-22:
round(1 - (abs(2 - 2) / 10), 2) = 1.0
- 45-55和45-55:
round(1 - (abs(8 - 8) / 10), 2) = 1.0
- 18-22和45-55:
round(1 - (abs(2 - 8) / 10), 2) = 0.4
- 10-18和55-75:
round(1 - (abs(1 - 9) / 10), 2) = 0.2
最终分数计算方法
为了计算最终分数,我们使用了以下公式:
Final Score = Food Score + Kitchen Score + Age Score
然后,我们按照最终分数对数据进行排序,以获取最佳配对。
解决方案代码
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name' : ['jacob', 'mary', 'rick', 'emily', 'sabastein', 'anna',
'christina', 'allen', 'jolly', 'rock', 'smith', 'waterman',
'mimi', 'katie', 'john', 'rose', 'leonardo', 'cinthy', 'jim',
'paul'],
'sex' : ['m', 'f', 'm', 'f', 'm', 'f', 'f', 'm', 'f', 'm', 'm', 'm', 'f',
'f', 'm', 'f', 'm', 'f', 'm', 'm'],
'food' : [0, 0, 1, 3, 2, 3, 1, 0, 0, 3, 3, 2, 1, 2, 1, 0, 1, 0, 3, 1],
'age' : ['10-18', '22-26', '29-34', '40-45', '18-22', '34-40', '55-75',
'45-55', '26-29', '26-29', '18-22', '55-75', '22-26', '45-55',
'10-18', '22-26', '40-45', '45-55', '10-18', '29-34'],
'kitchen' : [0, 1, 2, 0, 1, 2, 2, 1, 0, 0, 1, 0, 1, 1, 1, 0, 2, 0, 2, 1],
})
df['k_scr'] = np.where((df['kitchen'] == 2), 0.5, df['kitchen'])
df['f_scr'] = np.where((df['food'] == 1), 0, df['food'])
df['f_scr'] = np.where((df['food'] == 0), -1, df['f_scr'])
df['f_scr'] = np.where((df['food'] == 2), 1, df['f_scr'])
df['f_scr'] = np.where((df['food'] == 3), 1, df['f_scr'])
df['a_scr'] = np.where((df['age'] == '10-18'), 1, df['age'])
df['a_scr'] = np.where((df['age'] == '18-22'), 2, df['a_scr'])
df['a_scr'] = np.where((df['age'] == '22-26'), 3, df['a_scr'])
df['a_scr'] = np.where((df['age'] == '26-29'), 4, df['a_scr'])
df['a_scr'] = np.where((df['age'] == '29-34'), 5, df['a_scr'])
df['a_scr'] = np.where((df['age'] == '34-40'), 6, df['a_scr'])
df['a_scr'] = np.where((df['age'] == '40-45'), 7, df['a_scr'])
df['a_scr'] = np.where((df['age'] == '45-55'), 8, df['a_scr'])
df['a_scr'] = np.where((df['age'] == '55-75'), 9, df['a_scr'])
print(df)
commonarr = []
dfarr = np.array(df)
for i in range(len(dfarr) - 1):
for j in range(i + 1, len(dfarr)):
if dfarr[i][6] * dfarr[j][6] >= 0:
if dfarr[i][5] + dfarr[j][5] > 0:
row = []
row.append(dfarr[i][0])
row.append(dfarr[j][0])
row.append((dfarr[i][6] * dfarr[j][6]) +
(dfarr[i][5] + dfarr[j][5]) +
(round((1 - (abs(dfarr[i][7] -
dfarr[j][7]) / 10)), 2)))
commonarr.append(row)
ndf = pd.DataFrame(commonarr)
ndf = ndf.sort_values(by=[2], ascending=False)
print(ndf)
包含分数的输入/中间数据框
name sex food age kitchen k_scr f_scr a_scr
0 jacob m 0 10-18 0 0.0 -1 1
1 mary f 0 22-26 1 1.0 -1 3
2 rick m 1 29-34 2 0.5 0 5
3 emily f 3 40-45 0 0.0 1 7
4 sabastein m 2 18-22 1 1.0 1 2
5 anna f 3 34-40 2 0.5 1 6
6 christina f 1 55-75 2 0.5 0 9
7 allen m 0 45-55 1 1.0 -1 8
8 jolly f 0 26-29 0 0.0 -1 4
9 rock m 3 26-29 0 0.0 1 4
10 smith m 3 18-22 1 1.0 1 2
11 waterman m 2 55-75 0 0.0 1 9
12 mimi f 1 22-26 1 1.0 0 3
13 katie f 2 45-55 1 1.0 1 8
14 john m 1 10-18 1 1.0 0 1
15 rose f 0 22-26 0 0.0 -1 3
16 leonardo m 1 40-45 2 0.5 0 7
17 cinthy f 0 45-55 0 0.0 -1 8
18 jim m 3 10-18 2 0.5 1 1
19 paul m 1 29-34 1 1.0 0 5
输出
0 1 2
48 sabastein smith 4.0
10 mary allen 3.5
51 sabastein katie 3.4
102 smith jim 3.4
54 sabastein jim 3.4
99 smith katie 3.4
61 anna katie 3.3
45 sabastein anna 3.1
58 anna smith 3.1
14 mary rose 3.0
12 mary mimi 3.0
84 allen cinthy 3.0
98 smith mimi 2.9
105 waterman katie 2.9
11 mary jolly 2.9
50 sabastein mimi 2.9
40 emily katie 2.9
52 sabastein john 2.9
100 smith john 2.9
90 rock smith 2.8
47 sabastein rock 2.8
0 jacob mary 2.8
17 mary paul 2.8
13 mary john 2.8
119 katie jim 2.8
116 mimi paul 2.8
111 mimi john 2.8
103 smith paul 2.7
85 allen paul 2.7
120 katie paul 2.7
.. ... ... ...
该解决方案还有进一步优化的空间。