本文所用数据表格内容如下:
数据透视表实现的功能与数据分组相类似但又不同,数据分组是在一维(行)方向上不断拆分,而数据透视表则是在行、列方向上同时拆分。
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