datawhale组队学习打卡 变形
https://datawhalechina.github.io/joyful-pandas/build/html/%E7%9B%AE%E5%BD%95/ch5.html
一、长宽表的变形
长表:
pd.DataFrame({'Gender':['F','F','M','M'],
'Height':[163, 160, 175, 180]})
Out:
Gender Height
0 F 163
1 F 160
2 M 175
3 M 180
宽表:
pd.DataFrame({'Height: F':[163, 160],
'Height: M':[175, 180]})
Out:
Height: F Height: M
0 163 175
1 160 180
这两张表从信息上是完全等价的,它们包含相同的身高统计数值,只是这些数值的呈现方式不同。
1.pivot函数
pivot 是一种典型的长表变宽表的函数,首先来看一个例子:下表存储了张三和李四的语文和数学分数,现在想要把语文和数学分数作为列来展示。
使用pivot之前:
df = pd.DataFrame({'Class':[1,1,2,2],
'Name':['San Zhang','San Zhang','Si Li','Si Li'],
'Subject':['Chinese','Math','Chinese','Math'],
'Grade':[80,75,90,85]})
Out:
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
使用pivot之后:
df.pivot(index='Name', columns='Subject', values='Grade')
Out:
Subject Chinese Math
Name
San Zhang 80 75
Si Li 90 85
注意:
利用 pivot 进行变形操作需要满足唯一性的要求,即由于在新表中的行列索引对应了唯一的 value ,因此原表中的 index 和 columns 对应两个列的行组合必须唯一。例如,现在把原表中第二行张三的数学改为语文就会报错,这是由于 Name 与 Subject 的组合中两次出现 (“San Zhang”, “Chinese”) ,从而最后不能够确定到底变形后应该是填写80分还是75分。
df.loc[1, 'Subject'] = 'Chinese'
try:
df.pivot(index='Name', columns='Subject', values='Grade')
except Exception as e:
Err_Msg = e
Err_Msg
ValueError('Index contains duplicate entries, cannot reshape')
pandas 从 1.1.0 开始, pivot 相关的三个参数允许被设置为列表,这也意味着会返回多级索引。
df = pd.DataFrame({'Class':[1, 1, 2, 2, 1, 1, 2, 2],
'Name':['San Zhang', 'San Zhang', 'Si Li', 'Si Li',
'San Zhang', 'San Zhang', 'Si Li', 'Si Li'],
'Examination': ['Mid', 'Final', 'Mid', 'Final',
'Mid', 'Final', 'Mid', 'Final'],
'Subject':['Chinese', 'Chinese', 'Chinese', 'Chinese',
'Math', 'Math', 'Math', 'Math'],
'Grade':[80, 75, 85, 65, 90, 85, 92, 88],
'rank':[10, 15, 21, 15, 20, 7, 6, 2]})
df
Out:
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