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

Pandas按ID匹配及数值区间规则,将df1标签映射到df2

可行实现方案

以下代码基于pandas实现,完全匹配按ID分组、区间匹配标签的需求,两种方法按需选择即可。

前置准备

先确保已经导入pandas库:
import pandas as pd


方法1:区间索引匹配(推荐,性能最优)

核心是用pandas原生IntervalIndex处理区间判断,按ID分组匹配规则,避免低效循环,大数据量下表现更好。

# 1. 给配置表df1构建左闭右开的区间列,和示例匹配逻辑对齐:Samp≥Top且Samp<Bottom时命中对应标签
df1['rule_interval'] = pd.IntervalIndex.from_arrays(df1['Top'], df1['Bottom'], closed='left')

# 2. 定义单ID组内的标签匹配逻辑
def group_label_match(sub_df):
    target_id = sub_df.name
    # 提取当前ID对应的所有区间-标签映射
    id_rule_map = df1.query("ID == @target_id").set_index('rule_interval')['Label']
    # 逐行匹配Samp所属区间的标签,无匹配规则时默认返回None,可按需修改默认值
    sub_df['Label'] = sub_df['Samp'].apply(
        lambda val: next((label for itv, label in id_rule_map.items() if val in itv), None)
    )
    return sub_df

# 3. 按ID分组应用匹配逻辑,得到最终结果
df_result = df2.groupby('ID', group_keys=False).apply(group_label_match)

说明:你示例中ID为Z-3的行在给出的df1里没有对应配置规则,代码默认会给Label赋值None,把Z-3的区间规则补到df1里就能自动匹配到对应标签,和示例输出对齐。


方法2:关联过滤法(逻辑直白,适合小数据量)

如果对pandas高级特性不熟悉,可以用ID关联后过滤区间的写法,逻辑更容易理解:

# 1. 按ID把采样数据和同ID的所有配置规则关联
merged_tmp = df2.merge(df1, on='ID', how='left')
# 2. 过滤出Samp落在对应区间内的匹配记录
matched_records = merged_tmp[
    (merged_tmp['Samp'] >= merged_tmp['Top']) & 
    (merged_tmp['Samp'] < merged_tmp['Bottom'])
][['Samp', 'Var', 'ID', 'Label']]
# 3. 把匹配到的标签拼回原采样表,得到最终结果
df_result = df2.merge(matched_records, on=['Samp', 'Var', 'ID'], how='left')

注意事项

  • 区间开闭规则可以通过修改pd.IntervalIndex的closed参数调整,可选值为left(左闭右开)、right(左开右闭)、both(全闭)、neither(全开),当前代码用的左闭右开和给出的示例匹配逻辑完全一致。
  • 如果所有ID的区间规则完全统一,可以跳过分组步骤,直接全局构建区间映射做匹配,速度会更快。
  • 数据量超过10万行时优先选方法1,内存占用和运行速度都远优于方法2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:54:29