Pandas DataFrame分组后区分有效无效计数并拆分为多列的实现方法
实现方案
你可以通过两种常用路径实现需求,可根据你当前的代码进度选择:
方案1:基于你已生成的df2直接处理
如果已经生成了包含id1、id2、Count的df2,可直接加标记列后做分组聚合转宽:
# 先定义无效id2的常量 INVALID_ID2 = "00000000-0000-0000-0000-000000000000" # 新增列标记当前计数属于有效还是无效 df2["count_type"] = df2["id2"].apply(lambda x: "InvalidCount" if x == INVALID_ID2 else "ValidCount") # 按id1和计数类型分组求和后转宽表,空值补0 result = df2.groupby(["id1", "count_type"])["Count"].sum().unstack(fill_value=0).reset_index() # 调整列顺序匹配预期输出 result = result[["id1", "ValidCount", "InvalidCount"]] print(result)
方案2:直接从原始df一步生成结果,性能更优
如果还没生成df2,建议直接从原始df处理,减少一次分组操作:
import pandas as pd INVALID_ID2 = "00000000-0000-0000-0000-000000000000" # 先给原始df加是否有效的标记列 df["is_valid"] = df["id2"] != INVALID_ID2 # 按id1分组直接聚合两个统计值 result = df.groupby("id1").agg( ValidCount = ("is_valid", "sum"), InvalidCount = ("is_valid", lambda x: (~x).sum()) ).reset_index() print(result)
两种方案输出都和你给出的预期样例完全一致。如果存在某个id1下只有有效/只有无效计数的场景,fill_value=0会自动把缺失的统计值补为0,不会出现空值异常。
内容的提问来源于stack exchange,提问作者sri
相关产品推荐
相关产品推荐

