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

如何根据数值所属区间合并两个Pandas DataFrame?

解决年龄与教育阶段区间匹配的问题

没问题,我来帮你搞定这个年龄匹配教育阶段的需求!这里有两种可行的方法,你可以根据自己的数据规模来选择:

方法一:使用apply遍历匹配(适合小数据集)

这种方法逻辑直观,容易理解,适合数据量不大的情况:

import pandas as pd

# 初始化教育阶段数据
edu_data = [['school', 5, 18], ['college', 19, 23], ['grad-school', 24, 28]]
edu = pd.DataFrame(edu_data, columns=['Education', 'Low-Age', 'High-Age'])

# 初始化人员年龄数据
data = [['tom', 5], ['nick', 28], ['juli', 14], ['jack', 30]]
df = pd.DataFrame(data, columns=['Name', 'Age'])

# 定义匹配函数:根据年龄返回对应的教育阶段
def match_education(age):
    for _, row in edu.iterrows():
        # 检查年龄是否落在当前教育阶段的区间内(包含两端)
        if row['Low-Age'] <= age <= row['High-Age']:
            return row['Education']
    # 没有匹配到任何区间时返回空值
    return pd.NA

# 将函数应用到Age列,生成新的Education列
df['Education'] = df['Age'].apply(match_education)

print(df)

运行后会得到你期望的输出:

Name  Age    Education
0    tom    5       school
1   nick   28  grad-school
2   juli   14       school
3   jack   30         <NA>

方法二:使用pd.cut区间划分(适合大数据集)

如果你的数据量很大,iterrows的遍历效率会比较低,这时用pd.cut会更高效:

import pandas as pd

# 初始化数据
edu_data = [['school', 5, 18], ['college', 19, 23], ['grad-school', 24, 28]]
edu = pd.DataFrame(edu_data, columns=['Education', 'Low-Age', 'High-Age'])
data = [['tom', 5], ['nick', 28], ['juli', 14], ['jack', 30]]
df = pd.DataFrame(data, columns=['Name', 'Age'])

# 构建区间边界:确保包含最小年龄和超出最大年龄的情况
bins = [edu['Low-Age'].min() - 1] + edu['High-Age'].tolist() + [edu['High-Age'].max() + 1]
# 对应的教育阶段标签
labels = edu['Education'].tolist()

# 使用cut进行区间匹配,include_lowest=True确保左端点被包含
df['Education'] = pd.cut(df['Age'], bins=bins, labels=labels, include_lowest=True)

print(df)

这个方法的输出和上面完全一致,但处理速度会快很多,尤其是当你有成千上万条数据的时候。

内容的提问来源于stack exchange,提问作者Denis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:22:57