import numpy as np import pandas as pd
在数据分析中,常常需要用到数据透视表和交叉表,下面介绍pandas.DataFrame.pivot_table数据透视表和pandas.DataFrame.crosstab交叉表的用法和区别。
4.9.1 数据透视表
典型的数据格式是扁平的,只包含行和列,不方便总结信息。数据透视表(pivot table) 是一种类似GroupBy的操作方法,常见于Excel中。数据透视表将每一列数据作为输入,输出将数据不断细分为多个维度累计信息的二维数据表。
- 数据透视表用来做数据透视,可以通过一个或多个键分组聚合DataFrame中的数据,通过aggfunc参数决定聚合类型,是groupby的高级功能。
- 透视表就是将指定原有DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数(默认情况下式mean函数)。
使用pivot_table的好处:
- 灵活性高,可以随意定制你的分析计算要求
- 脉络清晰易于理解数据
- 操作性强,报表神器
pivot_table调用方式:
pd.pivot_table(data, values = None,index = None,columns = None,aggfunc ='mean',fill_value = None,margin = False,dropna = True,margins_name ='All' )
pd.pivot_table参数如下:
- data:DataFrame对象
- values:是要进行汇总、统计等运算列,可以是多个(list格式)
- index:数据透视表的index,从原数据的列中筛选,是作为新表的列名,可以是多个(list格式)
- columns:数据透视表的columns,从原数据的列中筛选,是作为新表的列名,可以是多个(list格式)
- aggfunc:用于聚合的函数,默认为numpy.mean,支持numpy计算方法,是做汇总的统计运算方法,常用的简单运算都可以,也可以是多种方法(每个不同的列指定一种方法),这样就可以免去了多次使用透视表在进行合并的麻烦。
- fill_value: 用于替换缺失值的值
- margin: 添加所有行/列
- dropna: 不包括条目为 NaN的列,默认为True
- margin_name: 当margin为True时,将包含总计的行/列的名称
注意,在所有参数中,values、index、columns最为关键,它们分别对应excel透视表中的值、行、列:
Index就是层次字段,要通过透视表获取什么信息就按照相应的顺序设置字段,所以在进行pivot之前你也需要足够了解你的数据。
In [2]:
#读取学生信息 st = pd.read_excel('data/stinfo.xlsx',index_col=0)
In [3]:
st.loc[0,'籍贯'] = '盐田' st.head(3)
Out[3]:
姓名 | 学号 | 出生日期 | 年龄 | 籍贯 | 性别 | 身高 | 体重 | linux | python | 网络 | 数据库 | IT基础 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 甲一 | 50 | 2001年1月1日 | 19 | 盐田 | 男 | 172 | 69 | 92 | 90 | 82 | NaN | 80 |
1 | 乙二 | 51 | 1999年2月2日 | 21 | 龙岗 | 男 | 180 | 77 | 95 | 88 | 85 | NaN | 80 |
2 | 丙三 | 52 | 2002年3月3日 | 18 | 南山 | 女 | 160 | 49 | 85 | 91 | 93 | NaN | 80 |
以性别做数据透视,统计不同籍贯的学号数目:
In [4]:
pd.pivot_table(st, values = '学号', index = '性别', columns = '籍贯',aggfunc=len)
Out[4]:
籍贯 | 南山 | 宝安 | 盐田 | 福田 | 龙岗 |
---|---|---|---|---|---|
性别 | |||||
女 | 1.0 | 2.0 | NaN | 1.0 | 1.0 |
男 | 1.0 | 1.0 | 1.0 | NaN | 3.0 |
以性别和籍贯共同做数据透视,统计不同(性别,籍贯