如何基于周期阈值删除DataFrame中符合条件的id组及对应行
解决方法:删除最大周期≤阈值的ID行
可以通过两种简洁的方法实现需求,核心思路都是先识别出最大周期超过阈值的ID,再保留这些ID的所有行。
方法一:用transform生成每行对应ID的最大周期
这种方法直接在原DataFrame上生成临时列,一步完成筛选:
import pandas as pd # 构造原始DataFrame data = {'id': [1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5,5, 5, 5,5], 'cycle': [1,2, 3, 4, 5,6,7,8,9,10,11, 1,2, 1,2, 3, 4, 5,6, 1,2, 3, 1,2, 3, 4, 5,6,7,8,9,], 'Salary': [7, 7, 7,8,9,10,11,12,13,14,15, 4, 4, 8,9,10,11,12,13, 8,9,10, 7, 7,9,10,11,12,13,14,15,], 'Children': ['No', 'Yes', 'Yes', 'Yes', 'Yes', 'No','No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'No','Yes', 'Yes', 'No','No', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'No',], 'Days': [123, 128, 66, 66, 120, 141, 52,96, 120, 141, 52, 96, 120, 15,123, 128, 66, 120, 141, 141,123, 128, 123, 128, 66, 123, 128, 66, 120, 141, 52,], } df = pd.DataFrame(data) cycle_threshold = 3 # 给每行添加对应ID的最大周期列 df['max_cycle'] = df.groupby('id')['cycle'].transform('max') # 筛选出最大周期超过阈值的行,同时删除临时列 filtered_df = df[df['max_cycle'] > cycle_threshold].drop(columns='max_cycle') print("筛选结果:\n", filtered_df)
groupby('id')['cycle'].transform('max'):按ID分组计算每个组的最大周期,再把结果映射到组内每一行,这样每行都能拿到对应ID的最大周期。- 最后筛选出符合条件的行,并清理临时列。
方法二:先获取合格ID列表再筛选
这种方法不生成临时列,适合处理大数据集:
# 计算每个ID的最大周期,得到ID与最大周期的映射 id_max_cycle = df.groupby('id')['cycle'].max() # 筛选出最大周期超过阈值的ID valid_ids = id_max_cycle[id_max_cycle > cycle_threshold].index # 保留这些ID的所有行 filtered_df = df[df['id'].isin(valid_ids)] print("筛选结果:\n", filtered_df)
groupby('id')['cycle'].max()生成一个Series,索引是ID,值是对应ID的最大周期。- 提取出符合条件的ID后,用
isin(valid_ids)直接过滤原DataFrame,保留目标行。
两种方法最终都会删除ID-2和ID-4的所有行,保留ID-1、3、5的完整数据。
内容的提问来源于stack exchange,提问作者NN_Developer
相关产品推荐
相关产品推荐

