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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:51:03