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

如何在Pandas中高效将groupby分状态计数转为单行双列格式?

Pandas多级索引转宽表实现方案

核心思路

利用Pandas的unstack()方法将多级索引中的isvalid级别展开为列,再通过重命名列名匹配需求格式;也可以直接用pivot_table一步生成目标表,两种方式都属于高效优化的实现方案。


方法一:基于已有groupby结果转换(推荐)

如果已经得到了numUsers这个多级索引的统计结果,直接用unstack展开并调整列名:

# 展开isvalid索引为列,缺失值填充为0(避免出现NaN)
result = numUsers.unstack(level="isvalid", fill_value=0)
# 重命名列名匹配需求
result.columns = ["count_invalid", "count_valid"]
# 调整列顺序为需求的count_valid在前
result = result[["count_valid", "count_invalid"]]

如果原始统计用size()代替count()会更高效(size()直接统计组内行数,无需检查非空值):

# 先高效生成统计结果
numUsers = df.groupby(["user", "isvalid"]).size()
# 再转宽表
result = numUsers.unstack("isvalid", fill_value=0).rename(columns={0.0: "count_invalid", 1.0: "count_valid"})[["count_valid", "count_invalid"]]

方法二:直接从原始DataFrame生成

用pivot_table一步到位,跳过单独的groupby步骤:

result = df.pivot_table(
    index="user",
    columns="isvalid",
    aggfunc="size",  # 用size比count高效,若需排除NaN则替换为count
    fill_value=0
)
# 重命名并调整列顺序
result.columns = ["count_invalid", "count_valid"]
result = result[["count_valid", "count_invalid"]]

最终效果

执行后得到的结果格式与需求完全一致:

count_valid  count_invalid
user 
5                           387           1336

内容的提问来源于stack exchange,提问作者AVEbrahimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:55:17