python - Python:不仅根据值,还根据其他参与者的最小距离对选择单个最小距离对
问题描述
例如,我有两个实体列表和一个测量它们之间距离的函数。假设它是名称和电子邮件。在下表中,我测量了每封电子邮件到每个姓名的距离。
1@ - {A:0.2, B:0.3, C:0.4, D:0.6}
2@ - {A:0.15, B:0.2, C:0.2, D:0.5}
3@ - {A:0.1, B:0.05, C:0.03, D:0.2}
现在我想为名称中的每个电子邮件找到单个最小距离对。但是,请注意,如果两个电子邮件具有相同的最小距离候选名称,则距离最小的获胜。在这种情况下,另一封电子邮件应该选择第二个最接近的候选名称并再次检查。
因此,在这种情况下,结果应该是:
1@: B
2@: A
3@: C
表说明:
电子邮件/姓名 | 一个 | 乙 | C | D |
---|---|---|---|---|
1@ | 0.2 | 0.3 | 0.4 | 0.6 |
2@ | 0.15 | 0.2 | 0.2 | 0.5 |
3@ | 0.1 | 0.05 | 0.03 | 0.2 |
速度很重要。它可以以数据帧或字典的形式处理,没关系。
谢谢你的帮助。
升级版:
当电子邮件数量>名称数量时,可能会有一些电子邮件未被分配,也需要捕获它们。
解决方案
假设你有这个数据框:
emails/names A B C D
0 1@ 0.20 0.30 0.40 0.6
1 2@ 0.15 0.20 0.20 0.5
2 3@ 0.10 0.05 0.03 0.2
然后:
df = df.set_index("emails/names")
numpy_df = df.to_numpy()
forbidden_rows, forbidden_cols = [], []
while len(forbidden_rows) != len(df):
row, col = np.unravel_index(numpy_df.argmin(), df.shape)
numpy_df[:, col] = np.inf
numpy_df[row, :] = np.inf
forbidden_rows.append(df.index[row])
forbidden_cols.append(df.columns[col])
for r, c in zip(forbidden_rows, forbidden_cols):
print(r, c)
印刷:
3@ C
2@ A
1@ B
编辑:将数据框转换为numpy.ndarray
第一个。
编辑:打印未分配的电子邮件:
对于此数据框:
emails/names A B C D
0 1@ 0.20 0.30 0.40 0.6
1 2@ 0.15 0.20 0.20 0.5
2 3@ 0.10 0.05 0.03 0.2
3 4@ 0.10 0.05 0.03 0.2
4 5@ 0.11 0.25 0.43 0.2
5 6@ 0.12 0.35 0.53 0.3
这个:
df = df.set_index("emails/names")
numpy_df = df.to_numpy()
forbidden_rows, forbidden_cols = [], []
while len(forbidden_rows) != len(df) and len(forbidden_cols) != len(df.columns):
row, col = np.unravel_index(numpy_df.argmin(), df.shape)
numpy_df[:, col] = np.inf
numpy_df[row, :] = np.inf
forbidden_rows.append(df.index[row])
forbidden_cols.append(df.columns[col])
for r, c in zip(forbidden_rows, forbidden_cols):
print(r, c)
print("Unassigned emails:")
print(df.index[~df.index.isin(forbidden_rows)].values)
印刷:
3@ C
4@ B
5@ A
6@ D
Unassigned emails:
['1@' '2@']
推荐阅读
- vega-lite - 在 Antora 中嵌入 Vega-Lite 图表
- r - 有没有办法使用变量来访问多维数组中的元素来存储索引
- c - 在运行时获取 ram 部分的地址
- java - Jpa 在第一个和第二个表中加入 where 子句
- linux - 如何调整列的块大小
- openedge - Progress Developer Studio for OpenEdge 出现语法错误,但从 Progress Editor 检查语法时,相同的代码不会出现任何语法错误
- sql-server - 如何检测 SQL Server 中查询执行的来源?
- android - 如何更改 apk 的方向,锁定在横向
- python - 在 python pandas 中使用 group by 方法的变量
- terraform - Tarraform iam 策略资源定义有条件地基于变量