如何在Pandas中基于多区间条件实现表连接?
问题描述
需要将两张表关联,根据分箱规则表中的区间(由pd.qcut生成的interval类型),把分数表中的每个分数匹配到对应的GROUP分组:
分箱规则表(第一张表)
| SCORE_BIN | NAME | GROUP |
|---|---|---|
| (0,0.5] | A | LOW |
| (0.5,1] | A | HIGH |
| (0,0.2] | B | LOW |
| (0.2,1] | B | HIGH |
分数表(第二张表)
| SCORE | CUST_NM |
|---|---|
| 0.1 | A |
| 0.8 | A |
| 0.9 | B |
| 0.1 | B |
预期输出
| SCORE | CUST_NM | GROUP |
|---|---|---|
| 0.1 | A | LOW |
| 0.8 | A | HIGH |
| 0.9 | B | HIGH |
| 0.1 | B | LOW |
解决方案
1. 准备示例数据
先通过代码还原两张表的结构:
import pandas as pd # 分箱规则表(SCORE_BIN为interval类型) bin_df = pd.DataFrame({ 'SCORE_BIN': pd.IntervalIndex.from_tuples([(0, 0.5), (0.5, 1), (0, 0.2), (0.2, 1)]), 'NAME': ['A', 'A', 'B', 'B'], 'GROUP': ['LOW', 'HIGH', 'LOW', 'HIGH'] }) # 分数表 score_df = pd.DataFrame({ 'SCORE': [0.1, 0.8, 0.9, 0.1], 'CUST_NM': ['A', 'A', 'B', 'B'] })
2. 关联匹配分组
利用interval类型的contains方法,结合apply逐行匹配对应分组:
def match_group(row): # 筛选当前用户对应的分箱规则 user_bins = bin_df[bin_df['NAME'] == row['CUST_NM']] # 找到包含当前分数的分箱,返回对应的GROUP target_bin = user_bins[user_bins['SCORE_BIN'].contains(row['SCORE'])] return target_bin['GROUP'].iloc[0] # 新增GROUP列 score_df['GROUP'] = score_df.apply(match_group, axis=1)
3. 查看结果
执行后score_df的输出与预期一致:
SCORE CUST_NM GROUP 0 0.1 A LOW 1 0.8 A HIGH 2 0.9 B HIGH 3 0.1 B LOW
内容的提问来源于stack exchange,提问作者Tanakorn Taweepoka
相关产品推荐
相关产品推荐

