如何在R中根据数值所属区间匹配第二个DataFrame的对应值
问题描述
我有一个DataFrame(记为df1),列A包含0-50的数值;另有一个DataFrame(记为df2),包含列B(数值区间字符串)和列C(对应标签值)。需要给df1添加列D,值为列A数值所属df2中B区间对应的C值。
df1示例:
| A |
|---|
| 1 |
| 50 |
df2示例:
| B | C |
|---|---|
| 0-10 | Low |
| ... | ... |
| 41-50 | High |
期望结果:
| A | D |
|---|---|
| 1 | Low |
| 50 | High |
解决方案
方法一:拆分区间 + pd.cut映射
适合区间连续且无重叠的场景,步骤清晰直观:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({'A': [1, 50]}) df2 = pd.DataFrame({'B': ['0-10', '11-20', '21-30', '31-40', '41-50'], 'C': ['Low', 'Medium-Low', 'Medium', 'Medium-High', 'High']}) # 拆分区间列B,提取上下限并转为整数类型 df2[['lower', 'upper']] = df2['B'].str.split('-', expand=True).astype(int) # 准备分界点数组(需包含区间上限外的边界,确保最大值被覆盖) bins = df2['lower'].tolist() + [df2['upper'].max() + 1] # 对应标签数组 labels = df2['C'].tolist() # 给df1添加列D,用pd.cut完成区间匹配 df1['D'] = pd.cut(df1['A'], bins=bins, labels=labels, include_lowest=True) print(df1)
方法二:使用merge_asof匹配
适合区间有序且无重叠的场景,性能更优:
import pandas as pd df1 = pd.DataFrame({'A': [1, 50]}) df2 = pd.DataFrame({'B': ['0-10', '11-20', '21-30', '31-40', '41-50'], 'C': ['Low', 'Medium-Low', 'Medium', 'Medium-High', 'High']}) # 拆分区间并转换数值类型 df2[['lower', 'upper']] = df2['B'].str.split('-', expand=True).astype(int) # merge_asof要求右表按匹配键排序 df2_sorted = df2.sort_values('lower') # 左表也按匹配键排序 df1_sorted = df1.sort_values('A') # 按A值匹配最近的lower区间,方向为向后匹配 result = pd.merge_asof(df1_sorted, df2_sorted, left_on='A', right_on='lower', direction='backward') # 过滤掉A值超出对应区间上限的情况 result = result[result['A'] <= result['upper']] # 恢复原索引顺序并整理列名 df1['D'] = result.set_index(df1_sorted.index)['C'] print(df1)
内容的提问来源于stack exchange,提问作者grapeporcupine
相关产品推荐
相关产品推荐

