Python Pandas:按两列唯一值统计另一列各值计数(交叉表/透视表)
按多列分组统计分类值出现次数
你需要按player和team两列的唯一组合,统计result列中各值的出现次数,同时补全未出现分类值的计数为0。以下是两种直接可行的解决方案:
方法1:groupby + value_counts + unstack
通过分组后统计组内分类频次,再将行转列并填充缺失值:
import pandas as pd df = pd.DataFrame({ 'player': ['A','A','B','B','C','D'], 'team': ['tmX','tmX','tmX','tmX','tmY','tmY'], 'result': ['hit','hit','hit','miss','miss','hit'] }) # 分组统计分类频次,转列后补0并重置索引 result_df = df.groupby(['player', 'team'])['result'].value_counts() result_df = result_df.unstack(fill_value=0).reset_index() print(result_df)
输出结果:
player team hit miss 0 A tmX 2 0 1 B tmX 1 1 2 C tmY 0 1 3 D tmY 1 0
方法2:pivot_table
利用透视表直接指定行、列、聚合规则,一步生成结果:
import pandas as pd df = pd.DataFrame({ 'player': ['A','A','B','B','C','D'], 'team': ['tmX','tmX','tmX','tmX','tmY','tmY'], 'result': ['hit','hit','hit','miss','miss','hit'] }) result_df = pd.pivot_table( df, index=['player', 'team'], columns='result', aggfunc='size', fill_value=0 ).reset_index() print(result_df)
输出结果与方法1完全一致:
player team hit miss 0 A tmX 2 0 1 B tmX 1 1 2 C tmY 0 1 3 D tmY 1 0
补充说明
value_counts()会自动统计组内每个分类的出现次数,unstack()将分类值转为列名,fill_value=0确保未出现的分类显示为0;pivot_table中的aggfunc='size'用于计数,和count功能相近,若数据中无缺失值两者可互换使用。
内容的提问来源于stack exchange,提问作者n_cen
相关产品推荐
相关产品推荐

