如何用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实现相同效果,尝试的两种方法均存在问题:
- 使用代码:
结果无法区分"j"和"n"的计数;pivot_table=pd.pivot_table(df,index=['Location','photo_pos'], columns='valid_photo').fillna(0) print(pivot_table) - 使用代码:
结果会带出原DataFrame的其他列;pivot_table=pd.pivot_table(df,index=['Location','photo_pos','valid_photo'], aggfunc='count') print(pivot_table)
尝试指定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
相关产品推荐
相关产品推荐

