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
相关产品推荐
相关产品推荐

