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

在Python Pandas中匹配DataFrame的ID并判断值是否在指定范围内

解决ID匹配与数值范围验证的问题

没问题,我来帮你搞定这个需求!首先我先补全一下df2的示例结构——毕竟你没给出它的具体内容,我假设它是每个ID对应一个数值范围(比如包含Start和End列),这也是这类需求最常见的场景,示例代码如下:

import numpy as np
import pandas as pd

# 你提供的df1
df1 = pd.DataFrame({
    'ID': pd.Series(["A","A","C","C"]),
    'Pos': pd.Series([10, 60, 63, 105], dtype='int64')
})

# 假设的df2:每个ID对应一个数值范围
df2 = pd.DataFrame({
    'ID': pd.Series(["A","B","C"]),
    'Start': pd.Series([5, 20, 60], dtype='int64'),
    'End': pd.Series([50, 40, 100], dtype='int64')
})

接下来咱们一步步实现需求:

步骤1:基于ID合并两个DataFrame

用pd.merge把两个表按ID关联起来,这样每个df1的行都能拿到对应ID的范围边界:

# 左连接保留df1的所有行,即使df2里没有对应ID
merged_df = pd.merge(df1, df2, on='ID', how='left')

步骤2:验证Pos是否落在对应范围内

用between方法快速判断Pos是否在Start和End之间,生成一个布尔列标记结果:

# 添加Is_Matched列,标记是否满足ID匹配且Pos在范围内
merged_df['Is_Matched'] = merged_df['Pos'].between(merged_df['Start'], merged_df['End'])
# 对于df2中没有的ID(比如如果df1有ID=B),Start/End会是NaN,between结果自动为False

最终结果展示

运行完上面的代码后,merged_df的内容会是这样:

IDPosStartEndIs_Matched
A10550True
A60550False
C6360100True
C10560100False

如果你需要的是只保留满足条件的行,直接过滤即可:

matched_rows = merged_df[merged_df['Is_Matched']]

补充说明

  • 如果df2中同一个ID对应多个范围,这个方法依然有效——合并后会生成多行,分别对应每个范围的验证结果
  • 如果你不需要保留合并后的范围列,可以最后用drop删掉:merged_df = merged_df.drop(['Start', 'End'], axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:24:36