Pandas索引的堆叠操作必知必会!

发布于:2024-05-31 ⋅ 阅读:(80) ⋅ 点赞:(0)

1. 索引的堆叠

  • stack()

【小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。

# 导包import numpy as npimport pandas as pddata = 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()

【小技巧】使用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
  • 使用fill_value填充

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