pandas层次化索引
1. 创建多层行索引
1) 隐式构造
最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
- Series也可以创建多层索引
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
s = Series([1,2,3,4],
index =[['a','a','b','b'],['期中','期末','期中','期末']] )
s
df = DataFrame(data = np.random.randint(0,150,size = (6,3)),
columns = ['语文','数学','python'],
index = [['Michael','Michael','Lisa','Lisa','Po','Po'],['期中','期末','期中','期末','期中','期末']])
#隐式创建
df
2) 显示构造pd.MultiIndex
- 使用数组
df1 = DataFrame(data = np.random.randint(0,150,size = (6,3)),
columns = ["Java",'Html5','Python'],
index = pd.MultiIndex.from_arrays([['张三','张三','李四','李四','Michael','Michael'],['期中','期末','期中','期末','期中','期末']]))
df1
- 使用tuple
df2 = DataFrame(data = np.random.randint(0,150,size = (6,4)),
columns = ["Spring",'Summer','Autumn','Winter'],
index = pd.MultiIndex.from_tuples([('张三','期中'),('张三','期末'),('李四','期中'),('李四','期末'),('Sara','期中'),('Sara','期末')]))
df2
-
使用product
最简单,推荐使用
df3 = DataFrame(data = np.random.randint(0,150,size = (12,4)),
columns = ["Spring",'Summer','Autumn','Winter'],
index = pd.MultiIndex.from_product([['张三','Sara','Lisa'],['middle','end'],list('AB')]))
df3
============================================
练习8:
- 创建一个DataFrame,表示出张三李四期中期末各科成绩
============================================
2. 多层列索引
除了行索引index,列索引columns也能用同样的方法创建多层索引
df4 = DataFrame(data = np.random.randint(0,150,size = (4,12)),
columns = pd.MultiIndex.from_product([['张三','Sara','Lisa'],['middle','end'],list('AB')]),
index = ["Spring",'Summer','Autumn','Winter'])
df4
3. 多层索引对象的索引与切片操作
1)Series的操作
【重要】对于Series来说,直接中括号[]与使用.loc[]完全一样,因此,推荐使用中括号索引和切片。
多层索引进行切片时,有些汉字,或者英文,不识别,运行异常,并不是代码的问题,自身的bug
(1) 索引
s
# 第一个参数,多层索引的第一维,第二个参数,多层索引第二维
s['a','期中']
#['a','期中']作为一个参数
s[['a','期中']]
s[['a','b','c']]
s.loc['李四','期末']
(2) 切片
s['a':'b']
s.iloc[0:3]
s2 = Series(data = np.random.randint(0,150,size = 6),index = pd.MultiIndex.from_product([list('ABC'),['e','f']]))
s2
s2['A':'C']
s2.loc['A':'B']
2)DataFrame的操作
(1) 可以直接使用列名称来进行列索引
对于二维索引,如果包含中文,进行切片时,存在报错bug,不是代码问题
df1.index = pd.MultiIndex.from_product([list('ABC'),['期中','期末']])
df1
df1['A':'B']
df1.iloc[0:4]
(2) 使用行索引需要用loc()等函数
【极其重要】推荐使用loc()函数
注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!
df2
df2.loc['张三','期中']
df2.loc['张三'].loc['期中']
df2.loc[['张三','李四']]
============================================
练习9:
-
分析比较Series和DataFrame各种索引的方式,熟练掌握.loc()方法
-
假设张三再一次在期中考试的时候因为特殊原因放弃英语考试,如何实现?
============================================
4. 索引的堆(stack)
stack()
unstack()
【小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
df4
#stack = 堆--->行
#多层索引的列而言0,1,1:从上往下计数
df4.stack()
df4.stack(level=0)
【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
df2
df2.unstack(level=1)
============================================
练习10:
-
使用unstack()将ddd变为两行,分别为期中期末
-
使用unstack()将ddd变为四行,分别为四个科目
============================================
5. 聚合操作
【注意】
-
需要指定axis
-
【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就会进行计算。
所谓的聚合操作:平均数,方差,最大值,最小值……
df1
#axis=0 进行行间计算
#axis=1 进行列间计算
df1.sum()
df1.sum(axis =1)
df1.mean(axis = 1)
#数据离散的程度,方差越大数值间差距大
df1.std(axis=1)
============================================
练习11:
-
计算各个科目期中期末平均成绩
-
计算各科目张三李四的最高分
============================================