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

按Type与option统计各年份出现次数的Pandas实现问题

按Type和Option统计各年份值的出现次数

问题背景

现有如下Pandas DataFrame:

import pandas as pd

d_f = pd.DataFrame({
'Type': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'],
'count': ['one', 'one', 'two', 'two', 'one', 'one'],
2022: [0, 0, 0.5, 1, 1, 1],
2023: [0, 0.5, 0.5, 1, 1, 1],
2024: [0.5, 0.5, 1, 1, 0, 0],
2025: [1, 0, 0.5, 0.5, 1, 1],
2026: [0, 0.5, 1, 1, 0, 0.5],
'option': [0, 1, 0, 0.5, 1, 0.5]})

需要实现:按Type分组,统计每个option值对应的各年份列的记录出现次数。

尝试了以下两段代码,但都没得到正确结果:

尝试代码1

table = d_f.pivot_table(index=['Type'], columns='option',aggfunc='count').fillna(0)
table

尝试代码2

table = d_f.groupby(['option', 'Type'])[2022, 2023, 2024, 2025, 2026].count()
table = table.unstack(level=0).fillna(0)

预期结果结构:

  • 行索引为Type的两个取值:foo、bar
  • 列是多层索引:第一层为年份(2022到2026),第二层为option的取值(0、0.5、1)
  • 每个单元格对应Type+option组合下,对应年份的有效记录条数

解决方案

方法1:groupby + size + 层级调整

# 按Type和option分组,统计每组记录数,unstack把option转为列
table = d_f.groupby(['Type', 'option'])[[2022,2023,2024,2025,2026]].size().unstack(fill_value=0)
# 交换列层级,把年份放到上层,option放到下层并排序
table = table.swaplevel(axis=1).sort_index(axis=1)

方法2:pivot_table 指定聚合列

table = d_f.pivot_table(
    index='Type',
    columns=['option'],
    values=[2022,2023,2024,2025,2026],
    aggfunc='count',
    fill_value=0
)
# 调整列层级顺序,匹配预期结果
table = table.swaplevel(axis=1).sort_index(axis=1)

最终结果

运行后得到的结果如下:

2022        2023        2024        2025        2026       
option    0  0.5  1    0  0.5  1    0  0.5  1    0  0.5  1    0  0.5  1
Type                                                                   
foo       2    0  1    2    0  1    2    0  1    2    0  1    2    0  1
bar       0    2  1    0    2  1    0    2  1    0    2  1    0    2  1

问题原因分析

  • 第一段代码的pivot_table未指定values参数,会对所有列(包括count列)聚合,导致结果包含多余层级和无关数据。
  • 第二段代码的groupby顺序是['option', 'Type'],unstack后列层级顺序与预期相反,且未做层级调整,最终结构不符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:27:24