在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的内容会是这样:
| ID | Pos | Start | End | Is_Matched |
|---|---|---|---|---|
| A | 10 | 5 | 50 | True |
| A | 60 | 5 | 50 | False |
| C | 63 | 60 | 100 | True |
| C | 105 | 60 | 100 | False |
如果你需要的是只保留满足条件的行,直接过滤即可:
matched_rows = merged_df[merged_df['Is_Matched']]
补充说明
- 如果
df2中同一个ID对应多个范围,这个方法依然有效——合并后会生成多行,分别对应每个范围的验证结果 - 如果你不需要保留合并后的范围列,可以最后用
drop删掉:merged_df = merged_df.drop(['Start', 'End'], axis=1)
内容的提问来源于stack exchange,提问作者SemiQuant
相关产品推荐
相关产品推荐

