按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
相关产品推荐
相关产品推荐

