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

Pandas按Ticket分组统一Policy:NOT COMPLIED优先级更高

问题

我有如下DataFrame:

Year-Week   Ticket  Policy       User
2022-35     12502   COMPLIED      MX 
2022-35     12502   NOT COMPLIED  US
2022-35     12502   COMPLIED      AL
2022-35     12502   COMPLIED      BR
2022-35     12471   COMPLIED      DE
2022-35     12409   COMPLIED      US
2022-35     12409   NOT COMPLIED  BR
2022-35     12406   COMPLIED      MX 

需求:当某个Ticket存在"NOT COMPLIED"记录时,该Ticket的所有Policy值统一设为"NOT COMPLIED";若仅存在"COMPLIED"记录则保持不变,不受周次限制。期望输出如下:

输出示例

Year-Week   Ticket  Policy       User
2022-35     12502   NOT COMPLIED  MX 
2022-35     12502   NOT COMPLIED  US
2022-35     12502   NOT COMPLIED  AL
2022-35     12502   NOT COMPLIED  BR
2022-35     12471   COMPLIED      DE
2022-35     12409   NOT COMPLIED  US
2022-35     12409   NOT COMPLIED  BR
2022-35     12406   COMPLIED      MX 

核心规则:"NOT COMPLIED"优先级高于"COMPLIED"。

解决方案

可以通过Pandas的分组和映射功能实现需求,具体代码如下:

import pandas as pd

# 构造原始DataFrame
data = {
    'Year-Week': ['2022-35']*8,
    'Ticket': [12502, 12502, 12502, 12502, 12471, 12409, 12409, 12406],
    'Policy': ['COMPLIED', 'NOT COMPLIED', 'COMPLIED', 'COMPLIED', 'COMPLIED', 'COMPLIED', 'NOT COMPLIED', 'COMPLIED'],
    'User': ['MX ', 'US', 'AL', 'BR', 'DE', 'US', 'BR', 'MX ']
}
df = pd.DataFrame(data)

# 生成Ticket到统一Policy的映射字典
ticket_policy_map = df.groupby('Ticket')['Policy'].apply(
    lambda x: 'NOT COMPLIED' if 'NOT COMPLIED' in x.values else 'COMPLIED'
).to_dict()

# 替换原DataFrame的Policy列
df['Policy'] = df['Ticket'].map(ticket_policy_map)

print(df)

逻辑说明

  1. 分组判断:按Ticket分组,检查每组的Policy列是否包含"NOT COMPLIED",生成一个字典,键为Ticket编号,值为该Ticket应统一使用的Policy值。
  2. 批量替换:利用map方法,根据原DataFrame的Ticket值,从字典中匹配对应的Policy值,批量替换原列内容。

这种方法能确保所有同Ticket的记录Policy值统一,完全符合需求。

内容的提问来源于stack exchange,提问作者exenlediatán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:35:26