Pandas用transpose/pivot/groupby实现行值转列并统计计数
实现代码与说明
你需要的分组转列计数逻辑,有两种常用的pandas实现方案,输出结果完全一致:
方法1:pd.crosstab 实现(写法最简洁)
crosstab是pandas内置的专门用于交叉频次统计的函数,不需要额外处理空值,默认会把不存在的组合计数填0:
import pandas as pd import numpy as np # 原始测试数据 df = pd.DataFrame({ 'Year': [2022,2022,2022,2022,2022,2022,2022,2022], 'Quarter':[2,2,2,2,1,1,2,2], 'Product':['Car','Bike','Car','Bus','Bike','Bus','Car','Bike'], }) # 按Year、Quarter分组,统计各Product出现次数,转Product为独立列 result = pd.crosstab( index=[df['Year'], df['Quarter']], columns=df['Product'] ).reset_index() # 把分组字段从多层索引转回普通列,方便后续使用 print(result)
运行输出结果:
Year Quarter Bike Bus Car 0 2022 1 1 1 0 1 2022 2 2 1 3
方法2:groupby + unstack 实现(逻辑更直观)
如果更习惯用分组操作的逻辑写代码,可以先分组计数,再把Product维度从行转列:
result = ( df .groupby(['Year', 'Quarter', 'Product']) .size() # 统计每个(Year,Quarter,Product)组合的记录数 .unstack(fill_value=0) # 将Product这层索引转为独立列,缺失值填0 .reset_index() )
提示:如果不需要把不存在的产品计数填为0,可以去掉
fill_value=0参数,对应位置会返回空值NaN。
内容的提问来源于stack exchange,提问作者SOK
相关产品推荐
相关产品推荐

