如何用Pandas将频次统计数据转换为指定样式的透视表?
解决方法
你可以通过两种方式实现需求的透视表:
方法1:使用pd.crosstab(推荐,更简洁)
crosstab专门用于计算分组频率,默认会自动填充缺失类别为0,非常适配你的场景:
import pandas as pd # 构造示例数据 data = {'Number': [123, 123, 455, 455, 455], 'Type': ['A', 'B', 'B', 'A', 'C']} df = pd.DataFrame(data) # 生成透视表 pivot_df = pd.crosstab(df['Number'], df['Type']).reset_index() # 添加SUM列,计算每行各Type的计数总和 pivot_df['SUM'] = pivot_df[['A', 'B', 'C']].sum(axis=1) # 查看结果 print(pivot_df)
方法2:使用pivot_table
如果坚持用pivot_table,需要指定计数类的聚合函数、填充缺失值,再手动添加SUM列:
import pandas as pd data = {'Number': [123, 123, 455, 455, 455], 'Type': ['A', 'B', 'B', 'A', 'C']} df = pd.DataFrame(data) pivot_df = df.pivot_table( index='Number', columns='Type', aggfunc='size', # 统计每个(Number, Type)组合的行数 fill_value=0 # 把不存在的Type组合填充为0 ).reset_index() # 添加SUM列 pivot_df['SUM'] = pivot_df.sum(axis=1) print(pivot_df)
你之前可能踩的坑:
- 没设置
fill_value=0,导致缺失的Type显示NaN而非0 - 用了错误的
aggfunc(比如默认的mean),而非计数类的size/count - 没调用
reset_index(),导致Number是索引而非普通列 - 忘记添加SUM列
两种方法最终输出都符合你的需求:
Type Number A B C SUM 0 123 1 1 0 2 1 455 1 1 1 3
内容的提问来源于stack exchange,提问作者NC11
相关产品推荐
相关产品推荐

