
1. 索引的堆叠
【小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
# 导包
import numpy as np
import pandas as pd
data = np.random.randint(0,100,size=(6,6))
# 行索引
index = pd.MultiIndex.from_product([
["1班","2班"],
["张三","李四","王五"]
])
# 列索引
columns = pd.MultiIndex.from_product([
["期中","期末"],
["语文","数学","英语"]
])
df = pd.DataFrame(data=data,index=index,columns=columns)
df
|
|
期中 |
期末 |
|
|
语文 |
数学 |
英语 |
语文 |
数学 |
英语 |
1班 |
张三 |
10 |
43 |
4 |
67 |
39 |
74 |
李四 |
75 |
72 |
39 |
11 |
69 |
68 |
王五 |
31 |
33 |
68 |
37 |
0 |
45 |
2班 |
张三 |
70 |
25 |
83 |
42 |
98 |
49 |
李四 |
65 |
24 |
91 |
44 |
73 |
9 |
王五 |
12 |
65 |
55 |
26 |
95 |
44 |
# stack:将列索引变成行索引(索引是从外往里,默认是将最里层的列索引变成行索引)
df.stack()
|
|
|
期中 |
期末 |
1班 |
张三 |
数学 |
43 |
39 |
英语 |
4 |
74 |
语文 |
10 |
67 |
李四 |
数学 |
72 |
69 |
英语 |
39 |
68 |
语文 |
75 |
11 |
王五 |
数学 |
33 |
0 |
英语 |
68 |
45 |
语文 |
31 |
37 |
2班 |
张三 |
数学 |
25 |
98 |
英语 |
83 |
49 |
语文 |
70 |
42 |
李四 |
数学 |
24 |
73 |
英语 |
91 |
9 |
语文 |
65 |
44 |
王五 |
数学 |
65 |
95 |
英语 |
55 |
44 |
语文 |
12 |
26 |
# level:默认是-1,表示最后一层
df.stack(level=-1)
|
|
|
期中 |
期末 |
1班 |
张三 |
数学 |
43 |
39 |
英语 |
4 |
74 |
语文 |
10 |
67 |
李四 |
数学 |
72 |
69 |
英语 |
39 |
68 |
语文 |
75 |
11 |
王五 |
数学 |
33 |
0 |
英语 |
68 |
45 |
语文 |
31 |
37 |
2班 |
张三 |
数学 |
25 |
98 |
英语 |
83 |
49 |
语文 |
70 |
42 |
李四 |
数学 |
24 |
73 |
英语 |
91 |
9 |
语文 |
65 |
44 |
王五 |
数学 |
65 |
95 |
英语 |
55 |
44 |
语文 |
12 |
26 |
df.stack(level=0)
|
|
|
数学 |
英语 |
语文 |
1班 |
张三 |
期中 |
43 |
4 |
10 |
期末 |
39 |
74 |
67 |
李四 |
期中 |
72 |
39 |
75 |
期末 |
69 |
68 |
11 |
王五 |
期中 |
33 |
68 |
31 |
期末 |
0 |
45 |
37 |
2班 |
张三 |
期中 |
25 |
83 |
70 |
期末 |
98 |
49 |
42 |
李四 |
期中 |
24 |
91 |
65 |
期末 |
73 |
9 |
44 |
王五 |
期中 |
65 |
55 |
12 |
期末 |
95 |
44 |
26 |
df.stack(level=1)
|
|
|
期中 |
期末 |
1班 |
张三 |
数学 |
43 |
39 |
英语 |
4 |
74 |
语文 |
10 |
67 |
李四 |
数学 |
72 |
69 |
英语 |
39 |
68 |
语文 |
75 |
11 |
王五 |
数学 |
33 |
0 |
英语 |
68 |
45 |
语文 |
31 |
37 |
2班 |
张三 |
数学 |
25 |
98 |
英语 |
83 |
49 |
语文 |
70 |
42 |
李四 |
数学 |
24 |
73 |
英语 |
91 |
9 |
语文 |
65 |
44 |
王五 |
数学 |
65 |
95 |
英语 |
55 |
44 |
语文 |
12 |
26 |
【小技巧】使用unstack()的时候,level等于哪一个,哪一个就是就消失,出现在列表。
df2 = df.stack(level=1)
df2
|
|
|
期中 |
期末 |
1班 |
张三 |
数学 |
43 |
39 |
英语 |
4 |
74 |
语文 |
10 |
67 |
李四 |
数学 |
72 |
69 |
英语 |
39 |
68 |
语文 |
75 |
11 |
王五 |
数学 |
33 |
0 |
英语 |
68 |
45 |
语文 |
31 |
37 |
2班 |
张三 |
数学 |
25 |
98 |
英语 |
83 |
49 |
语文 |
70 |
42 |
李四 |
数学 |
24 |
73 |
英语 |
91 |
9 |
语文 |
65 |
44 |
王五 |
数学 |
65 |
95 |
英语 |
55 |
44 |
语文 |
12 |
26 |
# unstack:将行索引变成列索引
df2.unstack()
|
|
期中 |
期末 |
|
|
数学 |
英语 |
语文 |
数学 |
英语 |
语文 |
1班 |
张三 |
43 |
4 |
10 |
39 |
74 |
67 |
李四 |
72 |
39 |
75 |
69 |
68 |
11 |
王五 |
33 |
68 |
31 |
0 |
45 |
37 |
2班 |
张三 |
25 |
83 |
70 |
98 |
49 |
42 |
李四 |
24 |
91 |
65 |
73 |
9 |
44 |
王五 |
65 |
55 |
12 |
95 |
44 |
26 |
df2.unstack(level=-1)
|
|
期中 |
期末 |
|
|
数学 |
英语 |
语文 |
数学 |
英语 |
语文 |
1班 |
张三 |
43 |
4 |
10 |
39 |
74 |
67 |
李四 |
72 |
39 |
75 |
69 |
68 |
11 |
王五 |
33 |
68 |
31 |
0 |
45 |
37 |
2班 |
张三 |
25 |
83 |
70 |
98 |
49 |
42 |
李四 |
24 |
91 |
65 |
73 |
9 |
44 |
王五 |
65 |
55 |
12 |
95 |
44 |
26 |
df2.unstack(level=0)
|
|
期中 |
期末 |
|
|
1班 |
2班 |
1班 |
2班 |
张三 |
数学 |
43 |
25 |
39 |
98 |
英语 |
4 |
83 |
74 |
49 |
语文 |
10 |
70 |
67 |
42 |
李四 |
数学 |
72 |
24 |
69 |
73 |
英语 |
39 |
91 |
68 |
9 |
语文 |
75 |
65 |
11 |
44 |
王五 |
数学 |
33 |
65 |
0 |
95 |
英语 |
68 |
55 |
45 |
44 |
语文 |
31 |
12 |
37 |
26 |
data = np.random.randint(0,100,size=(6,6))
# 行索引
index = pd.MultiIndex.from_tuples(
(
("1班","张三"),("1班","李四"),("1班","王五"),
("2班","鲁班"),("2班","张三丰"),("2班","张无忌")
)
)
# 列索引
columns = pd.MultiIndex.from_tuples(
(
("期中","语文"),("期中","数学"),("期中","英语"),
("期末","语文"),("期末","数学"),("期末","英语")
)
)
df = pd.DataFrame(data=data,index=index,columns=columns)
df
|
|
期中 |
期末 |
|
|
语文 |
数学 |
英语 |
语文 |
数学 |
英语 |
1班 |
张三 |
69 |
20 |
14 |
77 |
37 |
87 |
李四 |
40 |
35 |
8 |
25 |
43 |
15 |
王五 |
9 |
66 |
97 |
96 |
34 |
58 |
2班 |
鲁班 |
99 |
82 |
85 |
58 |
58 |
84 |
张三丰 |
96 |
11 |
98 |
87 |
4 |
61 |
张无忌 |
39 |
9 |
55 |
3 |
75 |
91 |
df.unstack()
|
期中 |
... |
期末 |
|
语文 |
数学 |
... |
数学 |
英语 |
|
张三 |
张三丰 |
张无忌 |
李四 |
王五 |
鲁班 |
张三 |
张三丰 |
张无忌 |
李四 |
... |
张无忌 |
李四 |
王五 |
鲁班 |
张三 |
张三丰 |
张无忌 |
李四 |
王五 |
鲁班 |
1班 |
69.0 |
NaN |
NaN |
40.0 |
9.0 |
NaN |
20.0 |
NaN |
NaN |
35.0 |
... |
NaN |
43.0 |
34.0 |
NaN |
87.0 |
NaN |
NaN |
15.0 |
58.0 |
NaN |
2班 |
NaN |
96.0 |
39.0 |
NaN |
NaN |
99.0 |
NaN |
11.0 |
9.0 |
NaN |
... |
75.0 |
NaN |
NaN |
58.0 |
NaN |
61.0 |
91.0 |
NaN |
NaN |
84.0 |
2 rows × 36 columns
df.unstack(fill_value=0)
|
期中 |
... |
期末 |
|
语文 |
数学 |
... |
数学 |
英语 |
|
张三 |
张三丰 |
张无忌 |
李四 |
王五 |
鲁班 |
张三 |
张三丰 |
张无忌 |
李四 |
... |
张无忌 |
李四 |
王五 |
鲁班 |
张三 |
张三丰 |
张无忌 |
李四 |
王五 |
鲁班 |
1班 |
69 |
0 |
0 |
40 |
9 |
0 |
20 |
0 |
0 |
35 |
... |
0 |
43 |
34 |
0 |
87 |
0 |
0 |
15 |
58 |
0 |
2班 |
0 |
96 |
39 |
0 |
0 |
99 |
0 |
11 |
9 |
0 |
... |
75 |
0 |
0 |
58 |
0 |
61 |
91 |
0 |
0 |
84 |
2 rows × 36 columns