pandas系列之数据透视表

1,110 阅读4分钟

本文所用数据表格内容如下:

image.png

数据透视表实现的功能与数据分组相类似但又不同,数据分组是在一维(行)方向上不断拆分,而数据透视表则是在行、列方向上同时拆分。

python中实现数据透视表用到pivot_table()方法

1.参数释义

该方法参数如下:

pivot_table(
    data,
    values=None,
    index=None,
    columns=None,
    aggfunc="mean",
    fill_value=None,
    margins=False,
    dropna=True,
    margins_name="All",
    observed=False,
) 

现一一说明如下:

data:表示要做数据透视表的那个表

values:对应excel中值那个框

index:对应excel中行那个框

columns:对应excel中列那个框

aggfunc:表示对values的计算类型

fill_value:表示对空值的填充值

margins:表示是否显示合计列

dropna:表示是否删除缺失,True代表将含缺失值的行整行都进行删除

margins_name:表示合计列的列名

2.数据透视表实例

先来看一下原始数据

import pandas as pd
​
user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户信息表.xlsx')
print(user_df)

result:

   用户id 等级  区域  城市  7月销量  8月销量  9月销量
0     1  A  华东  上海    65    67    78
1     2  B  华中  武汉    45    54    58
2     3  B  东北  大连    12    34    46
3     4  D  华南  广东    60    72    78
4     5  C  华中  长沙    56    67    74

2.1 默认情形下的透视表

user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户信息表.xlsx')
print(pd.pivot_table(user_df, values='用户id', columns='区域', index='等级', aggfunc='count'))

result:

区域   东北   华东   华中   华南
等级                    
A   NaN  1.0  NaN  NaN
B   1.0  NaN  1.0  NaN
C   NaN  NaN  1.0  NaN
D   NaN  NaN  NaN  1.0

上述结果就是以等级作为行(index),区域作为列(colums),对用户id进行统计运算.可以看到,默认情形下是不显示合计列的。

2.2 显示合计列

user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户信息表.xlsx')
print(pd.pivot_table(user_df, values='用户id', columns='区域', index='等级', aggfunc='count', margins=True))

result:

区域    东北   华东   华中   华南  All
等级                          
A    NaN  1.0  NaN  NaN    1
B    1.0  NaN  1.0  NaN    2
C    NaN  NaN  1.0  NaN    1
D    NaN  NaN  NaN  1.0    1
All  1.0  1.0  2.0  1.0    5

2.3 修改合计列的名称

user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户信息表.xlsx')
print(pd.pivot_table(user_df, values='用户id', columns='区域', index='等级', aggfunc='count', margins=True, margins_name='总计'))

result:

区域   东北   华东   华中   华南  总计
等级                        
A   NaN  1.0  NaN  NaN   1
B   1.0  NaN  1.0  NaN   2
C   NaN  NaN  1.0  NaN   1
D   NaN  NaN  NaN  1.0   1

可以看到,最后一列合计列的列名由AII变成了设置的总计

2.4 缺失值填充

user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户信息表.xlsx')
print(pd.pivot_table(user_df, values='用户id', columns='区域', index='等级', aggfunc='count', margins=True, margins_name='总计',
                          fill_value=0))

result:

区域 东北 华东 华中 华南 总计 等级 A 0 1 0 0 1 B 1 0 1 0 2 C 0 0 1 0 1 D 0 0 0 1 1 总计 1 1 2 1 5

可以看到,原来的NaN全部被0所填充

2.5 计算类型

aggfunc用来表示计算类型,也就是你要干什么,求和还是计数还是求平均值。当只传入一种类型时,表示对所有的值字段都执行同样的操作。如果需要对不同的值进行不同的计算类型,则需要传入字典。其中键为列名,值为计算方式

user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户信息表.xlsx')
print(
   pd.pivot_table(user_df, values=['用户id', '7月销量'], columns='区域', index='等级', aggfunc={'用户id': 'count', '7月销量': "sum"}, margins=True,
                        margins_name='总计', fill_value=0))

result:

   7月销量                   用户id            
区域   东北  华东   华中  华南   总计   东北 华东 华中 华南 总计
等级                                        
A     0  65    0   0   65    0  1  0  0  1
B    12   0   45   0   57    1  0  1  0  2
C     0   0   56   0   56    0  0  1  0  1
D     0   0    0  60   60    0  0  0  1  1
总计   12  65  101  60  238    1  1  2  1  5

2.5 索引重置

为了便于分析和处理,我们一般会对数据透视表的结果重置索引,也是使用reset_idnex()

user_df = pd.read_excel(r'C:\Users\viruser.v-desktop\Desktop\用户信息表.xlsx')
print(
    pd.pivot_table(user_df, values=['用户id', '7月销量'], columns='区域', index='等级', aggfunc={'用户id': 'count', '7月销量': "sum"}, margins=True,
                        margins_name='总计', fill_value=0).reset_index())

result:

    等级 7月销量                   用户id            

区域       东北  华东   华中  华南   总计   东北 华东 华中 华南 总计
0    A    0  65    0   0   65    0  1  0  0  1
1    B   12   0   45   0   57    1  0  1  0  2
2    C    0   0   56   0   56    0  0  1  0  1
3    D    0   0    0  60   60    0  0  0  1  1
4   总计   12  65  101  60  238    1  1  2  1  5