如何对含Alpha且有其他类型的ID/Category/Site组合计算时间差与实例数
Pandas分组统计:筛选含Alpha且存在其他Type的组合并计算指标
原始数据集
import pandas as pd df = pd.DataFrame( [[1,'A','X','1/2/22 12:00:00AM', 'Alpha'], [1,'A','X','1/3/22 12:00:00AM', 'Alpha'], [1,'A','X','1/1/22 12:00:00AM', 'Beta'], [1,'A','X','1/2/22 1:00:00AM', 'Gamma'], [1,'B','Y','1/1/22 1:00:00AM', 'Alpha'], [2,'A','Z','1/2/22 12:00:00AM', 'Alpha'], [2,'A','Z','1/1/22 12:00:00AM', 'Alpha'], [2,'A','Z','1/1/22 12:00:00AM', 'Beta']], columns=['ID', 'Category', 'Site', 'Task Completed', 'Type'])
需求说明
- 筛选
ID/Category/Site组合:该组合必须同时包含Type='Alpha'的记录,且至少存在一种非Alpha的Type - 对筛选出的组合,计算其中Alpha类型记录的
Task Completed日期最大最小值之差(天数) - 统计该组合中Alpha类型的实例数量
现有代码问题
原代码未加入Type相关的筛选与计算逻辑,输出结果包含了不符合条件的组合(如ID=1/Category=B/Site=Y),且计算的是全组而非仅Alpha数据的指标。
解决方案代码
import pandas as pd # 转换日期列为datetime类型 df["Task Completed"] = pd.to_datetime(df["Task Completed"], dayfirst=False) # 筛选符合条件的分组:包含Alpha且存在其他Type valid_groups = df.groupby(["ID", "Category", "Site"]).filter( lambda group: (group['Type'] == 'Alpha').any() and (group['Type'] != 'Alpha').any() ) # 仅保留Alpha数据,分组计算时间差和实例数 result = valid_groups[valid_groups['Type'] == 'Alpha'].groupby( ["ID", "Category", "Site"], as_index=False ).agg( **{ "Time Difference": ("Task Completed", lambda x: (x.max() - x.min()).days), "# of instances": ("Task Completed", "count") } ) print(result)
输出结果
ID Category Site Time Difference # of instances 0 1 A X 1 2 1 2 A Z 1 2
内容的提问来源于stack exchange,提问作者CowboyCoder
相关产品推荐
相关产品推荐

