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

如何用Pandas创建含索引分组计数的透视表?

问题描述

我有一个包含82行8列的DataFrame,结构如下:

Location  photo_pos Min_vis_point  ... valid_photo  photo_angle Distance
0          1          3           1.5  ...           j           20       10
1          1          3           1.5  ...           j           20       10
2          1          3           1.5  ...           j           20       10
3          1          9           1.5  ...           j           20       10
4          1          9           1.5  ...           j           20       10
..       ...        ...           ...  ...         ...          ...      ...
77         4          8           0.8  ...           j            0        7
78         4          5           0.8  ...           j            0        7
79         4          6             2  ...           j            0       10
80         4          9           1.5  ...           j            0       10
81         4          8           1.5  ...           j            0        7

我需要创建一个透视表,以Location、photo_pos、valid_photo为索引,统计每组中"j"或"n"的数量。

我已通过groupby实现该需求,代码如下:

'Grouping pictures by location in the blade and j/n criteria'
df_group_by_loc_valid=df.groupby(["Location","photo_pos","valid_photo"])["valid_photo"]

#Print the count of how many valid and not valid pictures for each location and position
print(df_group_by_loc_valid.count())

得到的结果正是我需要的:

Location  photo_pos  valid_photo
1         2          j              3
          3          j              3
          5          j              4
          6          j              5
          8          j              6
          9          j              5
2         3          j              4
                     n              2
          6          j              2
                     n              6
3         2          j              1
          3          j              3
          9          j              2
                     n              7
4         2          j              2
                     n              2
          5          j              1
          6          j              3
          8          j              2
          9          j              1
5         3          j              1
                     n              3
          6          j              4
          9          j              2
                     n              2
6         2          j              3
          3          j              1
          8          j              2
Name: valid_photo, dtype: int64

但我希望用pivot_table实现相同效果,尝试的两种方法均存在问题:

  • 使用代码:
    pivot_table=pd.pivot_table(df,index=['Location','photo_pos'], columns='valid_photo').fillna(0)
    print(pivot_table)
    
    结果无法区分"j"和"n"的计数;
  • 使用代码:
    pivot_table=pd.pivot_table(df,index=['Location','photo_pos','valid_photo'], aggfunc='count')
    print(pivot_table)
    
    结果会带出原DataFrame的其他列;
    尝试指定valid_photo为列时,报错"Grouper for 'valid_photo' not 1-dimensional"。

我期望实现的效果类似Excel透视表,以便生成对应图表。请问如何实现?

解决方案

要通过pivot_table实现和groupby完全一致的结果,或者生成适合绘图的Excel式透视表,可参考以下两种方法:

方法1:生成与groupby结构完全一致的透视表

明确指定要统计的目标列valid_photo,同时设置聚合函数为count,即可避免带出无关列:

pivot_table = pd.pivot_table(
    df,
    index=['Location', 'photo_pos', 'valid_photo'],
    values='valid_photo',
    aggfunc='count'
)

运行后得到的结果和你用groupby输出的结构、数据完全一致。

方法2:生成Excel式宽表(更适合绘图)

如果你想要把"j"和"n"作为列展示的宽格式透视表(直接对应Excel透视表效果,方便绘图),可以用以下代码:

pivot_table = pd.pivot_table(
    df,
    index=['Location', 'photo_pos'],
    columns='valid_photo',
    values='valid_photo',
    aggfunc='count',
    fill_value=0
)

这个结果会将valid_photo的不同取值作为列,每个Location+photo_pos组合对应的计数展示在对应列中,空值自动用0填充,完全匹配你需要的可视化前置格式。

问题原因说明

  • 第一次尝试未指定values参数,导致pivot_table对所有列执行聚合,结果层级混乱,无法清晰区分j/n的计数;
  • 第二次尝试同样未指定values,所以会统计所有列的数据,带出无关列;
  • 报错"Grouper for 'valid_photo' not 1-dimensional",大概率是因为valid_photo列存在非一维结构(比如包含列表类型数据),可以先通过df['valid_photo'].ndim检查维度,确保它是一维的Series。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:40:23