Python数据分析--数据分组/数据透视表

数据分组

分组键是列名

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
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值