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

Pandas DataFrame多级分组聚合后如何筛选符合要求的报价记录

Pandas 报价记录筛选实现方案

方案1:基于已生成的多级索引宽表筛选

你已经通过两次unstack得到了以QuoteNum为行索引的多级列宽表,直接按如下逻辑编写筛选条件即可:

# 1. 定义需要排除的三列(只要有值就不符合要求的列)
exclude_cols = [
    ('QuoteLine-count', 0, 'M'),
    ('QuoteLine-count', 0, 'P'),
    ('QuoteLine-count', 1, 'K')
]
# 2. 定义合法业务场景对应的三列(至少有一列有值才是有效记录)
valid_cols = [
    ('QuoteLine-count', 0, 'K'),
    ('QuoteLine-count', 1, 'M'),
    ('QuoteLine-count', 1, 'P')
]

# 3. 构造两个筛选条件
# 条件1:所有排除列均为空值
cond_exclude = grouped[exclude_cols].isna().all(axis=1)
# 条件2:合法列至少有一列非空
cond_valid = grouped[valid_cols].notna().any(axis=1)

# 4. 应用条件拿到结果
result = grouped[cond_exclude & cond_valid]

方案2:更简洁的实现(无需转宽表)

不用执行unstack转宽表,直接按QuoteNum分组判断全量条目是否符合业务规则即可,性能更高逻辑更直观:

# 定义单报价单的合规判断规则
def check_quote_valid(group):
    # 所有条目满足:无库存套件 或 有库存的自制/采购件
    rule = (group['stock'] == 0) & (group['typecode'] == 'K') | \
           (group['stock'] == 1) & (group['typecode'].isin(['M', 'P']))
    return rule.all()

# 直接过滤出所有合规的报价单记录
valid_quotes_df = df.groupby('QuoteNum').filter(check_quote_valid)

# 如果需要输出分组统计结果,再执行聚合即可
grouped_result = valid_quotes_df.groupby(['QuoteNum', 'typecode', 'stock']).agg({"QuoteLine": "count"})

内容的提问来源于stack exchange,提问作者Shreko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:27:00