如何在Python DataFrame中分组比较记录并生成相似度得分?
实现DataFrame分组相似度得分计算的最优方法
核心思路
利用Pandas的向量化操作替代逐行/逐组循环,先提取每个master_id对应的基准金额和日期,再通过合并将基准信息关联到每条记录,最后批量计算各项得分。这种方式效率远高于分组遍历,尤其适合大数据量场景。
完整实现步骤
- 构造初始数据(已有DataFrame可跳过此步)
import pandas as pd data = { 'id': ['a201', 'a101', 'a102', 'b24', 'b13', 'c71', 'c12', 'c1'], 'amount': [100, 70, 90, 150, 120, 10, 100, 12], 'date': ['12-10-2022', '12-10-2022', '12-10-2022', '12-10-2022', '12-10-2022', '12-10-2022', '12-10-2022', '12-10-2022'], 'group': ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c'], 'master_id': ['a201', 'a201', 'a201', 'b24', 'b24', 'c71', 'c71', 'c71'] } df = pd.DataFrame(data)
- 转换日期格式
将字符串日期转为Pandas datetime类型,方便计算日期差:
df['date'] = pd.to_datetime(df['date'], format='%d-%m-%Y')
- 提取基准信息
筛选出id与master_id一致的基准记录,提取其金额和日期并重命名:
master_info = df[df['id'] == df['master_id']][['master_id', 'amount', 'date']].rename( columns={'amount': 'master_amount', 'date': 'master_date'} )
- 关联基准信息
通过master_id将基准信息合并到原DataFrame,让每条记录都能直接获取对应基准数据:
df = df.merge(master_info, on='master_id', how='left')
- 计算各项得分
利用向量化判断批量生成得分:
# 金额得分:与基准金额差绝对值≤10得1,否则0 df['amount_score'] = (abs(df['amount'] - df['master_amount']) <= 10).astype(int) # 日期得分:与基准日期差绝对值≤5天得1,否则0 df['date_score'] = (abs(df['date'] - df['master_date']).dt.days <= 5).astype(int) # 总相似度得分 df['similarity_score'] = df['amount_score'] + df['date_score']
- 整理输出结果
移除中间辅助列,保留目标列:
result_df = df.drop(columns=['master_amount', 'master_date']) print(result_df)
方法优势
- 效率高:全程使用Pandas向量化操作,避免
apply或循环带来的性能损耗,数据量越大优势越明显; - 逻辑清晰:步骤拆分明确,便于维护和修改规则;
- 通用性强:后续调整得分规则时,只需修改对应判断条件即可。
内容的提问来源于stack exchange,提问作者Gosree
相关产品推荐
相关产品推荐

