Pandas pivot_table函数使用示例(数据透视)

其实Pandas有pivot、pivot_table两个函数来做数据透视,作用是一样的,只是pivot_table算是pivot的增强版,pivot_table对数据格式要求不高,而且支持aggfunc、fillvalue等参数,所以这里主要介绍pivot_table。

不过这里提一下,在使用pivot函数过程中可能会经常碰到一些异常,比如下面这个:

ValueError: Index contains duplicate entries, cannot reshape

这就是刚才说的,pivot函数对数据有些要求,这时可以尝试使用pivot_table

下面开始介绍和使用pivot_table函数

1. 先看下API
?df.pivot_table
image.png

values、index、columns参数都比较好理解,就是指定index作为纵轴索引、columns作为横轴索引来观察指定的values值,另外aggfunc指定的是均值函数(mean),下面边用边深入理解。

2. 先提前定义下数据集,以下的演示都是基于此数据集
import numpy as np
import pandas as pd
df = pd.DataFrame({'student': ['小红', '小红', '李华', '李华', '小天', '小天'],
                    'class': ['001','001','001','001','002','002'],
                   'subject': ['C', 'Java', 'Python', 'C', 'C', 'Python'],
                   'grades': [80,  90, 78, 90, 80, 78]})
df
image.png
3. 理解参数

index、columns参数必须传一个,否则会报以下错误:

ValueError: No group keys passed!

只传index时

df.pivot_table(index='subject')
image.png

只传columns时

df.pivot_table(columns='subject')
image.png

兄台不知道是否有疑问,原来数据中class、student这两列去哪里了???为啥只剩grades了???
我的理解是被忽略掉了,因为这两列不是数字,mean函数作用不了,为了更好理解我把默认的mean函数换成其他函数,慢慢往下看:

df.pivot_table(index='subject', aggfunc=lambda x: type(x))
image.png

可以看到其实aggfunc接受的参数是一个Pandas中的Series对象,那我们把Series转成列表看下里面是啥.

df.pivot_table(index='subject', aggfunc=lambda x: x.tolist())
image.png

搜德斯捏!!!原来就是通过指定维度后透视得到的值的列表,或者你可以理解是通过lookup来得到的一列值。所以mean函数在作用于class、student这两列是字符串元素的列表肯定是不对的,所以被过滤掉了。

4. 实例

基于上面的数据集,做些小需求来更深入理解pivot_table函数
(1)统计各个班级(class)的平均分

df.pivot_table(index='class')
image.png

(2)统计各个班级(class)的平均分以及班级学生人数

df.pivot_table(index='class', aggfunc={'grades': np.mean, 'student': lambda x: len(x.unique())})
image.png

(3)统计各个班级(class)的各个科目(subject)的平均分

df.pivot_table(index='class', columns='subject',  values='grades')

image.png

(4)统计各个班级(class)的各个科目(subject)的最高分,平且将空值填充为0

df.pivot_table(index='class', columns='subject',  values='grades', aggfunc=max, fill_value=0)

image.png

(5)统计各个班级(class)的各个科目(subject)的最高分,平且将空值填充为0

df.pivot_table(index='class', columns='subject',  values='grades', aggfunc=max, fill_value=0)

image.png

(6)统计各个班级(class)的各个科目(subject)的人数

df.pivot_table(index='class', columns='subject',  values='grades', aggfunc='count', fill_value=0)
image.png

(7)统计各个学生(student)的最高分,最低分,平均分

df.pivot_table(index='student', values='grades', aggfunc=[max, min, np.mean])
image.png

上面是多级索引,可能你想去掉grades这一级, 可以参考下面方法
stack()是行转列, 把grades从column变成了index, 再reset_index去掉grades

df.pivot_table(index='student', values='grades', aggfunc=[max, min, np.mean]).stack().reset_index(level=-1, drop=True)
image.png

(8)获取各个学生(student)的最高分的level, 其中划分方式是: "C" < 80 <= "B" < 90 <= "A"

import bisect

def get_grade_level(series):
    max_grade = max(series)
    return 'CBA'[bisect.bisect_right([80, 90], max_grade)]

df.pivot_table(index='student', values='grades', aggfunc=get_grade_level)
image.png

总结:pivot_table就是转换各个维度去观察数据, aggfunc就是在数据转换过程中的过程函数, 了解了pivot_table可以通过aggfunc函数实现很多功能。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353