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)
逻辑说明
- 分组判断:按
Ticket分组,检查每组的Policy列是否包含"NOT COMPLIED",生成一个字典,键为Ticket编号,值为该Ticket应统一使用的Policy值。 - 批量替换:利用
map方法,根据原DataFrame的Ticket值,从字典中匹配对应的Policy值,批量替换原列内容。
这种方法能确保所有同Ticket的记录Policy值统一,完全符合需求。
内容的提问来源于stack exchange,提问作者exenlediatán
相关产品推荐
相关产品推荐

