当前位置:   article > 正文

pandas数据分析41——不同地区不同城市数据分级统计汇总_pandas 数据分级

pandas 数据分级

案例背景 

实习一段时间,发现很多领导用Excel喜欢添加一个汇总行,若只有一个类别的汇总很简单,但是多个类别嵌套,不同层级嵌套都要进行汇总行添加,那就有点麻烦了,这个案例就是教大家怎么模板化输出带汇总的表。


代码实现

生成数据

先生成一个案例数据,不同地区,不同城市,不同销售商品:

  1. import pandas as pd
  2. from faker import Faker
  3. import random
  4. fake = Faker()
  5. # 假设的销售地区列表
  6. regions = ['华北', '华东', '华南', '华中', '西北', '西南', '东北']
  7. # 商品示例列表
  8. products = ['电视', '冰箱', '洗衣机', '空调']
  9. # 根据地区生成对应的城市列表
  10. region_cities = {
  11. '华北': ['北京', '天津', '石家庄'],
  12. '华东': ['上海', '南京', '杭州'],
  13. '华南': ['广州', '深圳', '海口'],
  14. '华中': ['武汉', '长沙', '郑州'],
  15. '西北': ['西安', '兰州', '银川'],
  16. '西南': ['成都', '重庆', '昆明'],
  17. '东北': ['沈阳', '大连', '哈尔滨']
  18. }
  19. # 生成数据集
  20. def generate_data(num_records):
  21. data = []
  22. for _ in range(num_records):
  23. region = random.choice(regions)
  24. city = random.choice(region_cities[region])
  25. product = random.choice(products)
  26. amount = round(random.uniform(1000, 5000), 2) # 生成金额
  27. quantity = random.randint(1, 100) # 生成销售数量
  28. data.append([region, city, product, amount, quantity])
  29. return data
  30. # 使用DataFrame存储数据
  31. df = pd.DataFrame(generate_data(1000), columns=['销售地区', '销售城市', '销售商品', '销售金额', '销售数量'])
  32. print(df.shape)
  33. df.head()

本想用Faker库生成的,但是gpt直接random库搞定了...这个数据集还是很好用的,1000条。


一层汇总

一层就是指不同地区,或者不同商品进行一个简单的汇总,例如我们计算不同销售地区的所有商品的销售金融和数量汇总,然后加上一个汇总行:

  1. #一层
  2. df.groupby('销售地区').sum(numeric_only=True).T.assign(汇总=lambda x:x.sum(1)).T

上面是统计不同的地区,这种方法直观一点,然后可以使用数据透视功能也行,下面统计不同商品

pd.pivot_table(df,index='销售商品',values=['销售金额','销售数量'],aggfunc='sum',margins=True,margins_name=f"合计")

上面是一层,若领导想看不同地区不同层数的商销售数量和金额,那就是二层了:


二层汇总

  1. #二层
  2. df.groupby('销售地区').apply(lambda x: pd.pivot_table(x,index='销售城市',values=['销售金额','销售数量'],aggfunc='sum',margins=True,margins_name=f"{x['销售地区'].values[0]}合计"))

也不难,先分类汇总,然后数据透视,对每个地区都进行了合计项的添加。

下面是三层。


三层汇总

有时候领导想看不同地区,不同城市的不同商品的销售数量和金额,还要对每个城市每个地区都进行汇总,3级嵌套有点麻烦,但是也能实现:

  1. def Statistical_summary(df,a,b):
  2. '''作用:三层嵌套汇总
  3. 参数说明
  4. a:要汇总的值字段,列表,如:["销售金额",'销售数量']
  5. b:要汇总的维度,列表,如:「"销售地区","销售城市","销售商品"]'''
  6. df1=(
  7. df.pivot_table(values=a,aggfunc='sum',margins=True,margins_name='总计',index=b).reset_index()
  8. .groupby(b[0]).apply(lambda x:pd.pivot_table(x,index=b[1:],values=a,aggfunc='sum',margins=True,margins_name=f'{x[b[0]].values[0]}合计')).reset_index()
  9. .groupby(b[:2],sort=False)
  10. .apply(lambda y: pd.pivot_table(y,index=b[-1],values=a,aggfunc='sum',margins=True,margins_name=f'{y[b[1]].values[0]}小计'))
  11. )
  12. return df1[~df1.index.get_level_values(-1).str.endswith(('合计小计'))]
Statistical_summary(df,['销售金额','销售数量'],['销售地区','销售城市','销售商品']).head(20)

这样不同的城市和不同的地区合计都有,一目了然,可以直接导出Excel表。

四层五层也是差不多的思路,分组聚合然后数据透视,多弄几次。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/685978
推荐阅读
相关标签
  

闽ICP备14008679号