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
相关产品推荐
相关产品推荐

