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

Python/Pandas:按POS分组为TYPE列不同值创建统计列

解决方案

嘿,这个需求刚好是pandas里处理分类统计的经典场景,尤其是当TYPE列有大量不同值时,手动创建列肯定不现实,用内置的交叉表或者分组转置就能自动搞定,给你两种简单的实现方式:

方法1:使用pd.crosstab(最简洁)

crosstab就是专门用来生成行列交叉统计的工具,直接指定行是POS,列是TYPE,它会自动统计每个POS下各TYPE的出现次数,所有TYPE值都会被自动转为列名,完美适配大量分类的场景:

import pandas as pd

data = {
 'POS': ['1','2','1','3','4'],
 'TYPE': ['A','A','A','B','C'],
 'VOLUME': [34,2,12,200,1],
}
df = pd.DataFrame(data)

# 生成交叉统计结果
type_count_by_pos = pd.crosstab(df['POS'], df['TYPE'])
print(type_count_by_pos)

执行后输出的结果如下:

TYPE  A  B  C
POS          
1     2  0  0
2     1  0  0
3     0  1  0
4     0  0  1

方法2:使用groupby + unstack

如果你更习惯用分组操作,也可以先按POS和TYPE分组统计数量,再把TYPE转成列:

# 分组统计数量,再转置列
type_count_by_pos = df.groupby(['POS', 'TYPE']).size().unstack(fill_value=0)
print(type_count_by_pos)

这个方法和上面的结果完全一致,fill_value=0是为了把那些POS下没有出现的TYPE填充为0,避免出现NaN值。

如果之后需要把这个统计结果和原DataFrame的其他数据(比如VOLUME)结合,可以用merge来关联,比如:

# 合并原数据的VOLUME(比如取每个POS的最大VOLUME)
pos_summary = df.groupby('POS')['VOLUME'].max().reset_index()
final_df = pos_summary.merge(type_count_by_pos, on='POS')
print(final_df)

这样就能得到包含POS、VOLUME以及各TYPE计数的完整结果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:40:24