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

Pandas:如何基于另一DataFrame的起止值提取指定范围的列数值?

正确提取DataFrame分组内指定区间的数值数据

问题场景

现有两个Pandas DataFrame:

  • df_0:包含setting分组列和对应的values数值列
  • df_1:存储每个setting对应的start_value(起始值)和end_value(结束值)

需求是从df_0中提取每个setting分组下,values处于df_1对应区间内的记录。


示例数据

先准备测试用的示例数据,方便验证结果:

import pandas as pd

# 示例 df_0
df_0 = pd.DataFrame({
    'setting': ['A', 'A', 'A', 'B', 'B', 'C', 'C'],
    'values': [1, 3, 5, 2, 6, 4, 8]
})

# 示例 df_1
df_1 = pd.DataFrame({
    'setting': ['A', 'B', 'C'],
    'start_value': [2, 3, 5],
    'end_value': [4, 7, 9]
})

方法一:合并后筛选(直观高效)

通过合并两个DataFrame,将每个setting的区间信息关联到df_0的每条记录,再直接筛选符合区间条件的行:

# 按setting合并两个DataFrame,关联对应区间
merged_df = pd.merge(df_0, df_1, on='setting')

# 筛选values在[start_value, end_value]内的记录
result = merged_df[(merged_df['values'] >= merged_df['start_value']) & 
                   (merged_df['values'] <= merged_df['end_value'])]

# 保留需要的列(可选)
result = result[['setting', 'values']]
print(result)

输出结果

setting  values
1       A       3
3       B       6
6       C       8

方法二:字典映射筛选(避免冗余合并)

如果不想产生合并后的冗余列,可以先把df_1的区间信息转成字典,再对df_0逐行判断:

# 将df_1转换为setting到(start_value, end_value)的字典
interval_map = df_1.set_index('setting')[['start_value', 'end_value']].apply(tuple, axis=1).to_dict()

# 自定义筛选逻辑
def is_in_interval(row):
    start, end = interval_map[row['setting']]
    return start <= row['values'] <= end

# 应用筛选
result = df_0[df_0.apply(is_in_interval, axis=1)]
print(result)

输出结果

和方法一完全一致。


错误原因说明

你之前用np.arange生成数值的思路不符合需求——需求是从已有的df_0.values数据中提取符合条件的记录,而非生成新的连续数值序列,所以会导致结果错误。上述两种方法都是基于df_0的原始数据进行筛选,完全匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:06:17