1.创建多层行索引
(1) 隐式构造
最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
-- Series也可以创建多层索引
import numpy as np import matplotlib.pyplot as plt import pandas as pd from pandas import Series, DataFrame '''使用Series创建多层索引(隐式)''' s = Series([80, 90, 82, 92], index=[['a', 'a', 'b', 'b'], ['期中', '期末', '期中', '期末']]) print(s) """ a 期中 80 期末 90 b 期中 82 期末 92 dtype: int64 """ '''使用DataFrame创建多层索引(隐式)''' df = DataFrame(np.random.randint(0, 150, size=(6, 3)), columns=['语文', '数学', 'python'], index=[['zsan', 'zsan', 'lisi', 'lisi', 'wwu', 'wwu'], ['mid', 'end', 'mid', 'end','mid', 'end']]) print(df) """ 语文 数学 python zsan mid 77 60 29 end 113 121 38 lisi mid 46 14 33 end 115 127 41 wwu mid 35 96 77 end 139 41 134 """
(2) 显示构造
--- 使用数组 pd.MultiIndex.from_arrays
--- 使用tuple pd.MultiIndex.from_tuples
--- 使用product pd.MultiIndex.from_product
"""显示构造.""" '''1.使用数组 pd.MultiIndex.from_arrays''' df1 = DataFrame(np.random.randint(0, 150, size=(6, 3)), columns=['Java', 'HTML5', 'Python'], index=pd.MultiIndex.from_arrays([['张三', '张三', '李四', '李四', '王五', '王五'], ['期中', '期末', '期中', '期末', '期中', '期末']])) print(df1) '''2.使用tuple pd.MultiIndex.from_tuples''' df2 = DataFrame(np.random.randint(0, 150, size=(6, 3)), columns=['Java', 'HTML5', 'Python'], index=pd.MultiIndex.from_tuples([('张三', '期中'), ('张三', '期末'), ('李四', '期中'), ('李四', '期末'), ('王五', '期中'), ('王五', '期末')])) print(df2) '''3.使用product pd.MultiIndex.from_product''' '''最简单,推荐使用''' df3 = DataFrame(np.random.randint(0, 150, size=(6, 3)), columns=['Java', 'HTML5', 'Python'], index=pd.MultiIndex.from_product([['张三', '李四', '王五'], ['期中', '期末']])) print(df3) """ # 三种不同的显示创建方式,同样的结果 Java HTML5 Python 张三 期中 133 79 133 期末 31 50 104 李四 期中 63 96 45 期末 145 14 103 王五 期中 145 39 53 期末 41 98 46 """
2.创建多层列索引
除了行索引index,列索引columns也能用同样的方法创建多层索引
"""多层列索引""" df4 = DataFrame(np.random.randint(0, 150, size=(3, 6)), columns=pd.MultiIndex.from_product([['Java', 'HTML', 'Python'], ['期中', '期末']]), index=['张三', '李四', '小张']) print(df4) """ Java HTML Python 期中 期末 期中 期末 期中 期末 张三 37 132 77 18 127 76 李四 8 47 65 59 68 63 小张 16 65 138 28 56 135 """
其他的方法都是类似的