You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中根据数值所属区间匹配第二个DataFrame的对应值

问题描述

我有一个DataFrame(记为df1),列A包含0-50的数值;另有一个DataFrame(记为df2),包含列B(数值区间字符串)和列C(对应标签值)。需要给df1添加列D,值为列A数值所属df2中B区间对应的C值。

df1示例:

A
1
50

df2示例:

BC
0-10Low
......
41-50High

期望结果:

AD
1Low
50High

解决方案

方法一:拆分区间 + 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:15:34