如何为分组后的Pandas DataFrame添加单个计数列并保留数值列均值
为分组均值结果添加单独计数列(避免冗余列)
需求是对DataFrame分组计算均值后,添加单独的count列记录每组样本量,同时不能使用.agg(["count","mean"])——因为该方法会为每个数值列生成对应的count和mean列,导致DataFrame过于庞大,不利于后续散点图绘制。
解决方案
先计算分组均值,再单独合并每组的样本计数:
- 用
groupby.mean()得到各数值列的分组均值 - 用
groupby.size()获取每组的样本数量,作为新的count列合并到结果中 - 可选:调整列顺序,将
count列前置,方便后续绘图使用
完整代码示例
import pandas as pd df = pd.DataFrame( { 'store':['store_a', 'store_a', 'store_b', 'store_b', 'store_b', 'store_c',], 'location':['North America', 'North America', 'Europe', 'Europe', 'Europe', 'Europe'], 'sales':[10, 5, 20, 20, 20, 10], 'cost':[5, 4, 10, 14, 14, 8], } ) # 计算分组均值 df_grouped = df.groupby(["store", "location"]).mean() # 添加count列,利用size()获取每组样本数 df_grouped['count'] = df.groupby(["store", "location"]).size() # 调整列顺序,将count放在最前面 df_grouped = df_grouped.reindex(columns=['count', 'sales', 'cost']) print(df_grouped)
输出结果
count sales cost store location store_a North America 2 7.5 4.500000 store_b Europe 3 20.0 12.666667 store_c Europe 1 10.0 8.000000
简化写法(用assign一步完成)
如果想更简洁,可以用assign方法直接在均值结果后添加count列:
df_grouped = df.groupby(["store", "location"]).mean().assign( count=lambda _: df.groupby(["store", "location"]).size() ).reindex(columns=['count', 'sales', 'cost'])
这种方法只会生成一个count列,完全符合需求,不会产生冗余数据,非常适合后续散点图绘制(比如用count控制点的大小)。
内容的提问来源于stack exchange,提问作者Devester
相关产品推荐
相关产品推荐

