Pandas数据重排stack/unstack函数

1
2
3
import pandas as pd
import random
import numpy as np
1
2
3
4
5
6
ar1 = np.random.randint(46, 99, size=20).reshape(4, 5)
lst1 = ["语文", "数学", "英语", "物理", "化学"]
lst2 = ["周明", "王鹏", "刘华", "罗宾"]

df = pd.DataFrame(ar1, index=lst2, columns=lst1)
df

out>>>>>

语文 数学 英语 物理 化学
周明 95 85 48 93 54
王鹏 72 50 50 80 47
刘华 96 67 60 80 97
罗宾 83 51 84 68 71

行列转置

1
df.T

out>>>>>

周明 王鹏 刘华 罗宾
语文 95 72 96 83
数学 85 50 67 51
英语 48 50 60 84
物理 93 80 80 68
化学 54 47 97 71

stack()

df.stack(level: 'Level' = -1, dropna: 'bool' = True)

  • 将指定级别从列堆叠到索引.将数据的列索引转换为行索引
  • stack和unstack默认操作为最内层,可以用level参数指定操作层
  • stack转换dataframe时,若只有一层列索引则转换后的类型为series,否则为dataframe
1
2
df.stack()
type(df.stack())

out>>>>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

周明 语文 95
数学 85
英语 48
物理 93
化学 54
王鹏 语文 72
数学 50
英语 50
物理 80
化学 47
刘华 语文 96
数学 67
英语 60
物理 80
化学 97
罗宾 语文 83
数学 51
英语 84
物理 68
化学 71
dtype: int32
pandas.core.series.Series
1
2
df.stack().to_frame()
type(df.stack().to_frame())

out>>>>>

0
周明 语文 95
数学 85
英语 48
物理 93
化学 54
王鹏 语文 72
数学 50
英语 50
物理 80
化学 47
刘华 语文 96
数学 67
英语 60
物理 80
化学 97
罗宾 语文 83
数学 51
英语 84
物理 68
化学 71
1
pandas.core.frame.DataFrame

unstack()

1
df.stack().unstack()

out>>>>>

语文 数学 英语 物理 化学
周明 95 85 48 93 54
王鹏 72 50 50 80 47
刘华 96 67 60 80 97
罗宾 83 51 84 68 71
1
2
df.unstack()
type(df.unstack())

out>>>>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

语文 周明 95
王鹏 72
刘华 96
罗宾 83
数学 周明 85
王鹏 50
刘华 67
罗宾 51
英语 周明 48
王鹏 50
刘华 60
罗宾 84
物理 周明 93
王鹏 80
刘华 80
罗宾 68
化学 周明 54
王鹏 47
刘华 97
罗宾 71
dtype: int32
pandas.core.series.Series
1
df.unstack().to_frame()

out>>>>>

0
语文 周明 95
王鹏 72
刘华 96
罗宾 83
数学 周明 85
王鹏 50
刘华 67
罗宾 51
英语 周明 48
王鹏 50
刘华 60
罗宾 84
物理 周明 93
王鹏 80
刘华 80
罗宾 68
化学 周明 54
王鹏 47
刘华 97
罗宾 71