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

