(七)Pandas数据分组统计

数据分组统计分析

分组统计函数groupby

功能

  • 根据给定的条件将数据拆分成组

  • 每个组可以独立应用函数(如sum())

  • 将结果合并到一个数据结构中

语法

  • df.groupby(by=None,axis=0,as_index=True,sort=True)

分组计算

  • 按照单列分组计算

  • 按照多列分组计算

  • 按照指定列分组计算

# 按照一列分组统计
import pandas as pd
pd.set_option('display.unicode.east_asian_width',True)
df=pd.read_excel('电脑配件销售记录.xlsx')
print(df)
'''
      产品名称  销售员  数量  标准单价  成交金额
0     无线网卡    王丽    10       178      1780
1     无线网卡  李桂林    30       178      5340
2         鼠标    李欢     6       299      1794
3         鼠标    李欢    15       299      4485
4         鼠标  李桂林    16       299      4784
5         鼠标    王双    52       299     15548
'''
print('-------------------------')
df1=df[['产品名称','数量','标准单价']]
#print(df1)
print(df1.groupby('产品名称',as_index=False).sum()) # 对数量,标准单价都进行求和统计
'''
     产品名称  数量  标准单价
0     DVD光驱   150       960
1    SD存储卡    44       870
2      手写板    57       380
3    无线网卡    40       356
4  蓝牙适配器   322       648
5        键盘   140       360
6      麦克风   178       495
7        鼠标   166      1495
'''

# 按照多列分组统计
df2=df1.groupby(['产品名称','销售员']).sum() # 对数量进行求和,根据产品名称和销售员进行分组
print(df1)

# 分组并按指定列进行计算
print(df1.groupby('产品名称')['数量'].sum()) # 只对数量进行求和,数据展示只展示数量,不展示单价。

分组数据的迭代

  • 通过for循环对分组统计数据进行迭代(遍历分组数据)
# 多列分组,数据迭代
# 按照多列分组统计
# 分组数据迭代
# 分组并按指定列进行计算
import pandas as pd
pd.set_option('display.unicode.east_asian_width',True)
df=pd.read_excel('电脑配件销售记录.xlsx')

df1=df[['产品名称','数量','标准单价']] #提取数据
#print(df1.groupby('产品名称')) #分组之后的数据类型为DataFrameGroupBy 
for name,group in df1.groupby('产品名称'):
    print(name)
    print(group)
    print('-------------------------------')
'''
DVD光驱
   产品名称  数量  标准单价
25  DVD光驱    30       240
26  DVD光驱    32       240
27  DVD光驱    40       240
28  DVD光驱    48       240
-------------------------------
SD存储卡
    产品名称  数量  标准单价
22  SD存储卡     9       290
23  SD存储卡    15       290
24  SD存储卡    20       290
-------------------------------
'''
    
# 多列分组,数据迭代
# 按照多列分组统计
for (k1,k2),group in df1.groupby(['产品名称','销售员']):
    print(k1,k2)
    print(group)    
    print('-------------------------------') 
'''
DVD光驱 华国华
   产品名称  销售员  数量
8   DVD光驱  华国华    48
12  DVD光驱  华国华    40
-------------------------------
DVD光驱 王丽
   产品名称 销售员  数量
14  DVD光驱   王丽    32
26  DVD光驱   王丽    30
-------------------------------
'''

对分组的某列或多列使用聚合函数

  • 通过groupby()与agg()函数
  • 常用的函数函数,sum(),mean(),max(),min()等
import pandas as pd
df=pd.read_excel('电脑配件销售记录.xlsx')
#print(df.head())
df1=df[['产品名称','数量']]
#print(df1)
print(df1.groupby('产品名称').agg(['sum','mean']))
'''
           数量           
            sum       mean
产品名称                  
DVD光驱     150  37.500000
SD存储卡     44  14.666667
手写板       57  28.500000
无线网卡     40  20.000000
蓝牙适配器  322  53.666667
键盘        140  70.000000
麦克风      178  35.600000
鼠标        166  33.200000
'''

# 对不同的列采用不同的聚合函数
df1=df[['产品名称','数量','成交金额']]
df1.groupby('产品名称').agg({'数量':['sum','mean'],'成交金额':['max','min']})
'''
			数量				成交金额
			 sum	mean	  max	min
产品名称				
DVD光驱	   150	37.500000	 11520	 7200
SD存储卡	   44	14.666667	5800	2610
手写板		   57	28.500000	8170	2660
无线网卡	  40	20.000000	5340	1780
蓝牙适配器	 322	53.666667  10260	1944
键盘		   140	 70.000000	 21600	 3600
麦克风		   178	 35.600000	6138	396
鼠标		   166	 33.200000	 23023	 1794
'''
# 能过自定义的函数实现分组统计
import pandas as pd
df=pd.read_excel('电脑配件销售记录.xlsx')
#print(df.head())

#回顾知识点
# print(type(df['产品名称'])) #Series
# print(df['产品名称'].value_counts())
maxcount=lambda x:x.value_counts().index[0] #行索引为0的
maxcount.__name__='销量最多的产品' 
df1=df.agg({'产品名称':maxcount,'数量':'sum'})
print(df1)
'''
产品名称    蓝牙适配器
数量              1097
dtype: object
'''

通过字典和Series对象进行分组统计

  • 通过字典进行分组统计
  • 通过Series进行分组统计
# 通过字典进行分组统计
import pandas as pd
pd.set_option('display.unicode.east_asian_width',True)
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
df=pd.read_excel('JD手机销售数据.xlsx')
#print(df.head())
df=df.set_index('商品名称') # 设置商品名称为行索引
#print(df)
dict1={'北京出库销量':'华北地区',
       '上海出库销量':'华东地区',
       '广州出库销量':'华南地区',
       '天津出库销量':'华北地区',
       '苏州出库销量':'华东地区',
       '沈阳出库销量':'东北地区',
       '杭州出库销量':'华东地区'      
}
df1=df.groupby(dict1,axis=1).sum()
print(df1)
'''
                 东北地区  华东地区  华北地区  华南地区
商品名称                                               
荣耀V40轻奢版         156      1064      1031       578
OPPO A93               66       405       431       230
Apple iPhone 11        48       341       370       189
OPPO K7x               32       258       260       136
OPPO Reno5             37       203       231       115
Apple iPhone 12        34       163       148        88
荣耀X10                29       141       136        81
Redmi 9                13       122       137        75
Redmi K30S              9        62        83        51
OPPOA8                  5        79        66        42
'''


# 根据Series对象进行分组统计
s=pd.Series(dict1) # 构建Series对象
df1=df.groupby(s,axis=1).sum() #分组,按行统计求和
print(df1)  # 也能达到以上效果

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值