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

Pandas中DataFrame操作与聚合:生成指定格式计数聚合表

如何将分组计数结果转换为指定格式的透视表DataFrame?

问题背景

你有如下原始DataFrame:

import pandas as pd

dfdict = {'letter': ['a', 'a', 'a', 'b', 'b'], 'category': ['foo', 'foo', 'bar', 'bar', 'spam']}
df1 = pd.DataFrame(dfdict)

它的结构是:

category letter
0    foo      a
1    foo      a
2    bar      a
3    bar      b
4    spam     b

你希望生成按category为行、letter为列的计数表:

a  b
foo     2  0
bar     1  1
spam    0  1

你已经通过df1.groupby(['category','letter']).size()得到了分组计数的结果:

category  letter
bar       a        1
          b        1
foo       a        2
spam      b        1

现在需要进一步处理得到目标格式。


解决方案

你已经走对了第一步,这里有两种简单的方法可以帮你快速拿到想要的结果:

方法一:基于已有分组结果转换

你得到的多级索引计数结果,只需要用unstack()把内层索引转成列,再用fill_value=0填充缺失的计数即可:

# 先获取分组计数
counts = df1.groupby(['category','letter']).size()
# 转换为宽表并填充0
result = counts.unstack(fill_value=0)
print(result)

运行后输出正好是你想要的格式:

a  b
foo     2  0
bar     1  1
spam    0  1

方法二:一步到位用pivot_table

如果不想先做groupby,可以直接用pivot_table函数,一步生成目标表,逻辑更直观:

result = df1.pivot_table(
    index='category',  # 行索引设置为category
    columns='letter',  # 列索引设置为letter
    aggfunc='size',    # 聚合方式为计数
    fill_value=0       # 缺失的计数组合填充为0
)

这个方法的结果和上面完全一致,步骤更简洁。


原理说明

  • unstack()的作用是把多级索引的内层(这里是letter)转成列,原本不存在的组合(比如foo和b)会显示为NaN,fill_value=0参数能把这些空值直接替换成0。
  • pivot_table是Pandas专门用来生成透视表的工具,直接指定行、列和聚合逻辑,就能快速得到结构化的统计结果,很适合这类行列转换的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:18:19