目录
1 长宽表的变形
- 长表和宽表:这个概念是对于某一个特征而言的。比如,一个表中把性别存储在某一个列中,那么它就是关于性别的长表;如果把性别作为列名,列中的元素是某一其他的相关特征数值,那么这个表是关于性别的宽表。
# 关于性别的长表 pd.DataFrame({ 'Gender':['F','F','M','M'], 'Height':[163, 160, 175, 180]}) ''' Gender Height 0 F 163 1 F 160 2 M 175 3 M 180 ''' # 关于性别的宽表 pd.DataFrame({ 'Height: F':[163, 160], 'Height: M':[175, 180]}) ''' Height: F Height: M 0 163 175 1 160 180 '''
- 分析:这两张表从信息上是完全等价的,它们包含相同的身高统计数值,只是这些数值的呈现方式不同,而其呈现方式主要又与性别一列选择的布局模式有关,即到底是以
long
的状态存储还是以wide
的状态存储。
1.1 pivot
- 作用:
pivot
是一种典型的长表变宽表的函数 - 三要素:对于长变宽的操作,重要的是变形后的行索引、需要转到列索引的列,以及这些列和行索引对应的数值,分别对应
pivot
方法中的index, columns, values
参数columns
:新生成表的列索引是columns
对应列的unique
值index
:新表的行索引是index
对应列的unique
值values
:values
对应了想要展示的数值列
- 【例子】把语文和数学分数作为列来展示
''' 原表: Class Name Subject Grade 0 1 San Zhang Chinese 80 1 1 San Zhang Math 75 2 2 Si Li Chinese 90 3 2 Si Li Math 85 ''' # 变形 df.pivot(index='Name', columns='Subject', values='Grade') ''' Subject Chinese Math Name San Zhang 80 75 Si Li 90 85 '''
- 变形过程:
- 变形过程:
- 要满足的要求:
pivot
函数进行变形操作需要满足唯一性的要求,即原表中的index
和columns
对应两个列的行组合必须唯一,因为在新表中的行列索引对应了唯一的value
。- 【例子】 :如果把原表中第二行张三的数学改为语文就会报错,这是由于
Name
与Subject
的组合中两次出现 (“San Zhang”, “Chinese”) ,从而最后不能够确定到底变形后应该是填写80分还是75分。
- 【例子】 :如果把原表中第二行张三的数学改为语文就会报错,这是由于
- 参数为列表:
pivot
相关的三个参数允许被设置为列表,结果就会返回多级索引- 【例子】:把测试类型和科目联合组成的四个类别(期中语文、期末语文、期中数学、期末数学)转到列索引,并且同时统计成绩和排名:
''' 原表: Class Name Examination Subject Grade rank 0 1 San Zhang Mid Chinese 80 10 1 1 San Zhang Final Chinese 75 15 2 2 Si Li Mid Chinese 85 21 3 2 Si Li Final Chinese 65 15 4 1 San Zhang Mid Math 90 20 5 1 San Zhang Final Math 85 7 6 2 Si Li Mid Math 92 6 7 2 Si Li Final Math 88 2 ''' pivot_multi = df.pivot(index = ['Class', 'Name'], columns = ['Subject','Examination'], values = ['Grade','rank']) pivot_multi ''' Grade rank Subject Chinese Math Chinese Math Examination Mid Final Mid Final Mid Final Mid Final Class Name 1 San Zhang 80 75 90 85 10 15 20 7 2 Si Li 85 65 92 88 21 15 6 2 '''
- 分析:根据唯一性原则,新表的行索引等价于对
index
中的多列使用drop_duplicates
,而列索引的长度为values
中的元素个数乘以columns
的唯一组合数量(与 index 类似) 。
!!这段重新看!!