数据分组统计分析
分组统计函数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) # 也能达到以上效果