Python中如何基于两列测试值为患者数据匹配最近的预定义Mood类别
分类打标实现方案
核心逻辑是基于A、B两个维度的欧氏距离匹配最近的Mood基准,1万行患者数据的量级下,普通运算即可快速完成,不需要额外复杂优化。
依赖库
- pandas:DataFrame数据处理
- numpy:数值计算
- 可选:scikit-learn(用于超大数据量下的快速近邻查询)
完整代码实现
首先导入依赖:
import pandas as pd import numpy as np
假设你的患者数据存储在df_patient,Mood基准数据存储在df_mood,执行匹配逻辑:
# 提取Mood基准的特征和标签数据 mood_features = df_mood[["A", "B"]].values mood_labels = df_mood["Mood"].values # 定义匹配函数:输入患者行数据,返回最近的Mood标签 def get_closest_mood(patient_row): # 计算当前患者和所有Mood基准的欧氏距离,省略开平方也不影响距离大小比较 dists = np.sum((mood_features - [patient_row["A"], patient_row["B"]]) ** 2, axis=1) # 返回距离最小对应的Mood return mood_labels[np.argmin(dists)] # 为所有患者匹配Mood,生成新列 df_patient["matched_mood"] = df_patient.apply(get_closest_mood, axis=1)
可选优化方案(适合十万级以上数据量)
如果后续患者数据量级大幅提升,可以用KDTree实现更快的近邻查询:
from sklearn.neighbors import KDTree # 基于Mood基准特征构建KD树 kdtree = KDTree(mood_features) # 批量查询所有患者的最近邻,返回对应索引 _, min_idx = kdtree.query(df_patient[["A", "B"]].values, k=1) # 批量赋值匹配结果 df_patient["matched_mood"] = mood_labels[min_idx.flatten()]
示例运行结果
针对你给出的测试数据,最终匹配结果如下:
| patient id | A | B | matched_mood |
|---|---|---|---|
| EHR123456 | 0.415 | 0.230 | Type D |
| EHR987653 | 0.854 | 0.705 | Type G |
| EHR657483 | 0.364 | 0.881 | Type A |
内容的提问来源于stack exchange,提问作者nicoe
相关产品推荐
相关产品推荐

