如何用循环基于指定索引拆分Pandas DataFrame并校验条件
问题描述
现有如下Pandas DataFrame,已筛选得到分割值列表re_ind(值为[85, 512]),需要完成两个操作:
- 基于该列表将原DataFrame拆分为多个子DataFrame,例如:
index列值小于85的部分、介于85和512之间的部分、大于等于512的部分(注:原代码中自定义了index列,需注意区分DataFrame自带行索引与该自定义列); - 对每个子DataFrame,校验
diff_in_min列的求和结果是否大于500,统计符合条件的子表数量。
需要通过循环实现上述创建子DataFrame并校验条件的操作。
附修正后原代码:
import pandas as pd import numpy as np df = pd.DataFrame() df['index'] = [0, 28, 35, 49, 85, 105, 208, 386, 419, 512, 816, 888, 914, 989] df['diff_in_min'] = [5, 35, 42, 46, 345, 85, 96, 107, 119, 325, 8, 56, 55, 216] df['val_1'] = [5, 25, 2, 4, 2, 5, 69, 6, 8, 7, 55, 85, 8, 67] df['val_2'] = [8, 89, 8, 5, 7, 57, 8, 57, 4, 8, 74, 65, 55, 74] # 修正原代码中re_ind的错误格式,转为目标分割值列表 re_ind = [85, 512]
解决方案
步骤1:构建完整分割区间
给re_ind添加首尾边界(负无穷、正无穷),确保所有数据行都能被覆盖到对应区间。
步骤2:循环拆分并校验条件
遍历每个区间,筛选出对应子DataFrame,计算diff_in_min列的和,判断是否大于500并统计符合条件的数量。
完整实现代码:
import pandas as pd import numpy as np # 初始化DataFrame df = pd.DataFrame() df['index'] = [0, 28, 35, 49, 85, 105, 208, 386, 419, 512, 816, 888, 914, 989] df['diff_in_min'] = [5, 35, 42, 46, 345, 85, 96, 107, 119, 325, 8, 56, 55, 216] df['val_1'] = [5, 25, 2, 4, 2, 5, 69, 6, 8, 7, 55, 85, 8, 67] df['val_2'] = [8, 89, 8, 5, 7, 57, 8, 57, 4, 8, 74, 65, 55, 74] re_ind = [85, 512] # 构建包含首尾边界的分割点列表 split_points = [-np.inf] + re_ind + [np.inf] count = 0 # 循环处理每个分割区间 for i in range(len(split_points) - 1): lower = split_points[i] upper = split_points[i+1] # 根据区间位置设置筛选条件,匹配需求的分割逻辑 if i == 0: sub_df = df[df['index'] < upper] elif i == len(split_points)-2: sub_df = df[df['index'] >= lower] else: sub_df = df[(df['index'] >= lower) & (df['index'] < upper)] # 计算当前子表的diff_in_min总和并判断 sum_diff = sub_df['diff_in_min'].sum() if sum_diff > 500: count += 1 print(f"子表{i+1}符合条件,diff_in_min总和为{sum_diff}") else: print(f"子表{i+1}不符合条件,diff_in_min总和为{sum_diff}") print(f"\n符合条件的子表数量:{count}")
代码说明
- 首尾边界的添加避免了数据遗漏,确保所有行都能被分配到对应子表;
- 针对不同区间位置设置的筛选逻辑,完全匹配需求中的分割规则;
- 循环内完成子表创建、求和校验、计数的全流程操作,逻辑清晰易维护。
运行结果
执行代码后会输出:
子表1不符合条件,diff_in_min总和为128 子表2符合条件,diff_in_min总和为752 子表3符合条件,diff_in_min总和为335 符合条件的子表数量:2
内容的提问来源于stack exchange,提问作者Sushil Kokil
相关产品推荐
相关产品推荐

