Pandas如何按ID分组后根据同组其他行对应值删除指定行
实现代码
你可以通过分组后构建组内年份-Bool值映射的方式实现需求,逻辑简洁且执行效率较高,示例代码如下:
import pandas as pd def filter_group(group): # 构建当前组内Cur.year到Bool列的映射字典 year_bool_map = dict(zip(group['Cur.year'], group['Bool'])) # 逐行判断是否满足保留条件 keep_mask = group['Acceptable year'].apply( lambda x: x in year_bool_map and year_bool_map[x] ) return group[keep_mask] # 按ID分组后应用过滤规则 result_df = df.groupby('ID', group_keys=False).apply(filter_group)
效果验证
我们用你给出的示例数据测试:
# 构造示例DataFrame data = { 'ID': [1,1,1,1,1], 'Cur.year': [2020, 2017, 2016, 2015, 2014], 'Bool': [True, True, True, False, True], 'Acceptable year': [2019, 2016, 2015, 2014, 2013] } df = pd.DataFrame(data) # 执行过滤 result_df = df.groupby('ID', group_keys=False).apply(filter_group) print(result_df)
输出结果和预期一致,仅保留符合条件的两行:
ID Cur.year Bool Acceptable year 1 1 2017 True 2016 3 1 2015 False 2014
逻辑说明
- 每组先构建
Cur.year到Bool的映射,避免逐行遍历全组的性能损耗 apply生成的布尔掩码keep_mask中仅为True的行才会被保留,完全匹配你给出的规则:- 若
Acceptable year不存在于组内Cur.year中,掩码为False直接删除 - 若存在但对应
Bool值为False,掩码为False删除 - 仅存在且对应
Bool为True时掩码为True保留
- 若
内容的提问来源于stack exchange,提问作者Jan Valušek
相关产品推荐
相关产品推荐

