数据分组/数据透视表
数据分组
分组键是列名
df
>>>
用户ID 客户分类 区域 是否省会 7月销量 8月销量 9月销量
0 59224 A 一线 是 6 20 0
1 55295 B 三线 否 37 27 35
2 46035 A 二线 是 8 1 8
3 2459 C 一线 是 7 8 14
4 22179 B 三线 否 9 12 4
# 按照一列分组
df.groupby('客户分类').count()
>>>
用户ID 区域 是否省会 7月销量 8月销量 9月销量
客户分类
A 2 2 2 2 2 2
B 2 2 2 2 2 2
C 1 1 1 1 1 1
# 对分组后的数据进行运算
df.groupby('客户分类').sum() # 只有数据类型是数值(int float)的列参与运算
>>>
用户ID 7月销量 8月销量 9月销量
客户分类
A 105259 14 21 8
B 77474 46 39 39
C 2459 7 8 14
# 按照多列分组
df.groupby(['客户分类','区域']).count()
>>>
用户ID 是否省会 7月销量 8月销量 9月销量
客户分类 区域
A 一线 1 1 1 1 1
二线 1 1 1 1 1
B 三线 2 2 2 2 2
C 一线 1 1 1 1 1
df.groupby(['客户分类','区域']).sum()
>>>
用户ID 7月销量 8月销量 9月销量
客户分类 区域
A 一线 59224 6 20 0
二线 46035 8 1 8
B 三线 77474 46 39 39
C 一线 2459 7 8 14
# 单独计算某列
df.groupby('客户分类')['用户ID'].count()
>>>
客户分类
A 2
B 2
C 1
Name: 用户ID, dtype: int64
分组键是Series
DataFrame的其中一列就是一个Series
# 按照一个Series分组
df.groupby(df['客户分类']).count()
>>>
用户ID 区域 是否省会 7月销量 8月销量 9月销量
客户分类
A 2 2 2 2 2 2
B 2 2 2 2 2 2
C 1 1 1 1 1 1
# 按照多个Series分组
df.groupby([df['客户分类'],df['区域']]).count()
>>>
用户ID 是否省会 7月销量 8月销量 9月销量
客户分类 区域
A 一线 1 1 1 1 1
二线 1 1 1 1 1
B 三线 2 2 2 2 2
C 一线 1 1 1 1 1
# 对分组后的某列进行汇总计算
df.groupby(df['客户分类'])['用户ID'].count()
>>>
客户分类
A 2
B 2
C 1
Name: 用户ID, dtype: int64
aggregate方法
aggregate一次可以使用多种汇总方式,且可以针对不同的列做不同的汇总运算
# 先对分组后的所有列作计数汇总运算,然后对所有列作求和汇总运算
df.groupby('客户分类').aggregate(['count','sum'])
>>>
用户ID 区域 是否省会 7月销量 8月销量 9月销量
count sum count sum count sum count sum count sum count sum
客户分类
A 2 105259 2 一线二线 2 是 是 2 14 2 21 2 8
B 2 77474 2 三线三线 2 否 否 2 46 2 39 2 39
C 1 2459 1 一线 1 是 1 7 1 8 1 14
# 不同类别用户在7、8月的销量
df.groupby('客户分类').aggregate({'用户ID':'count','7月销量':'sum','8月销量':'count'})
>>>
用户ID 7月销量 8月销量
客户分类
A 2 14 2
B 2 46 2
C 1 7 1
对分组后的结果重置索引
df.groupby('客户分类').sum()
>>>
用户ID 7月销量 8月销量 9月销量
客户分类
A 105259 14 21 8
B 77474 46 39 39
C 2459 7 8 14
df.groupby('客户分类').sum().reset_index()
>>>
客户分类 用户ID 7月销量 8月销量 9月销量
0 A 105259 14 21 8
1 B 77474 46 39 39
2 C 2459 7 8 14
数据透视表
pd.pivot_table(data , values = None ,index = None ,columns = None , aggfunc ='mean' , fiil_value = None ,margins = False , dropna = True , margins_name = 'All')
- data表示呀做数据透视表的整个表
- values对应Excel中值那个框
- index对应Excel中行那个框
- columns对应Excel中列那个框
- aggfunc表示对values的计算类型
- fill_value表示对空值的填充值
- margins表示是否显示合计列
- dropna表示是否删除缺失,如果为真,则把一整行全作为缺失值删除
- margins_name表示合计列的列名
# python透视表合计列默认关闭
pd.pivot_table(df,values = '用户ID',columns ='区域',index = '客户分类',aggfunc = 'count')
>>>
区域 一线 三线 二线
客户分类
A 1.0 NaN 1.0
B NaN 2.0 NaN
C 1.0 NaN NaN
# 显示合计列
pd.pivot_table(df,values = '用户ID',columns = '区域',index = '客户分类',aggfunc = 'count',margins = True)
>>>
区域 一线 三线 二线 All
客户分类
A 1.0 NaN 1.0 2
B NaN 2.0 NaN 2
C 1.0 NaN NaN 1
All 2.0 2.0 1.0 5
# 修改合计列名称
pd.pivot_table(df,values = '用户ID',columns = '区域',index = '客户分类',aggfunc = 'count',margins = True,margins_name = '总计')
>>>
区域 一线 三线 二线 总计
客户分类
A 1.0 NaN 1.0 2
B NaN 2.0 NaN 2
C 1.0 NaN NaN 1
总计 2.0 2.0 1.0 5
# 将缺失值填充为0
pd.pivot_table(df,values = '用户ID' , columns = '区域',index = '客户分类',aggfunc = 'count',margins = True,fill_value = 0)
>>>
区域 一线 三线 二线 All
客户分类
A 1 0 1 2
B 0 2 0 2
C 1 0 0 1
All 2 2 1 5
aggfunc用来表示计算类型,当只传入一种类型时,表示对所有的值字段都进行同样计算;如对不同值进行不同的计算类型,则需要传入一个字典。其中键为列名,值为计算方式
# 对用户ID计数,对7月销量求和
pd.pivot_table(df,values =['用户ID','7月销量'],columns = '区域',index = '客户分类',aggfunc = {'用户ID':'count','7月销量':'sum'})
>>>
7月销量 用户ID
区域 一线 三线 二线 一线 三线 二线
客户分类
A 6.0 NaN 8.0 1.0 NaN 1.0
B NaN 46.0 NaN NaN 2.0 NaN
C 7.0 NaN NaN 1.0 NaN NaN
# 结果重置索引
pd.pivot_table(df,values =['用户ID','7月销量'],columns = '区域',index = '客户分类',aggfunc = {'用户ID':'count','7月销量':'sum'}).reset_index()
>>>
客户分类 7月销量 用户ID
区域 一线 三线 二线 一线 三线 二线
0 A 6.0 NaN 8.0 1.0 NaN 1.0
1 B NaN 46.0 NaN NaN 2.0 NaN
2 C 7.0 NaN NaN 1.0 NaN NaN