import numpy as np
import pandas as pd
from pandas import Series,DataFrame
- Series也可以创建多层索引
s = Series(data=[100,98,89,90],
index=[["张三","张三","李四","李四"],["期中","期末","期中","期末"],
["a","b","a","b"]])
s
df = DataFrame(data=[100,98,89,90],
index=[["张三","张三","李四","李四"],["期中","期末","期中","期末"],
["a","b","a","b"]],
columns = ["python"]
)
df
df1 = DataFrame(data=np.random.randint(0,150,size=(4,4)),
index=[["张三","张三","李四","李四"],["期中","期末","期中","期末"],
["a","b","a","b"]],
columns = [["后台","后台","前端","前端"],
["python","java","H5","jQuery"]]
)
df1
df1.index
- 使用数组
# 创建一个多层索引
mindex =pd.MultiIndex.from_arrays([["a",'a','a','b','b','b'],
['一单元',"二单元","三单元",'一单元',"二单元","三单元"]])
mindex
# 用上面的多层索引创建一个df
df = DataFrame(np.random.randint(0,150,size=(6,1)),index=mindex,
columns=["python"])
df
df = DataFrame(np.random.randint(0,150,size=(1,6)),index=["python"],
columns=mindex
)
df
- 使用tuple
mindex = pd.MultiIndex.from_tuples([("河南","郑州"),
("河南","洛阳"),
("山东","济南"),
("河北","石家庄"),
("北京","天安门"),
("四川","成都"),
("江苏","南京")])
# 注意:每个元组代表一个行(或列)的索引名,索引名要用元组的元素来体现
mindex
df = DataFrame(np.random.randint(1,100,size=(7,1)),index=mindex,
columns=["收入(万)"])
df
使用product
最简单,推荐使用
mindex = pd.MultiIndex.from_product([["河南","山东"],['郑州','济南']])
mindex
df = DataFrame(np.random.randint(0,100,size=(4,1)),index=mindex)
df
sindex = pd.MultiIndex.from_product([["张三","李四"],["期中","期末"],
["月考一","月考二","月考三"]])
sindex
df = DataFrame(np.random.randint(0,150,size=(12,1)),index=sindex)
df
============================================
练习8:
- 创建一个DataFrame,表示出张三李四期中期末各科成绩
============================================
除了行索引index,列索引columns也能用同样的方法创建多层索引
# 参照多层行索引
【重要】对于Series来说,直接中括号[]与使用.loc()完全一样,因此,推荐使用中括号索引和切片。
(1) 索引
s
s["张三"]["期末"]["b"]
s["张三","期中","a"]
s[["张三","期中","afdsa","李四","李四"]]
# 1、如果多个索引里面有无效,则不查找
# 2、如果有重复有效,只查找一次
(2) 切片
s.loc["张三":"李四","期中":"期末"]
s.iloc[0:4]
# 【注意】多层索引创建的是显示索引,对隐式索引没有任何影响(隐式索引仍然是代表序列)
(1) 可以直接使用列名称来进行列索引
(2) 使用行索引需要用ix(),loc()等函数
【极其重要】推荐使用loc()函数
注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!
sindex = pd.MultiIndex.from_product([["张三","李四"],["期中","期末"],
["月考一","月考二","月考三"]])
sindex
df = DataFrame(data=np.random.randint(0,150,size=(12,3)),index=sindex,
columns=["python","java","UI"])
df
df["python"]["张三"]
df[["python"]].loc["张三","期中"]
df.loc["张三","期中",'月考一']
df.loc[["张三","期中",'月考一',"李四"]]
df.loc["张三":"李四"]
df.iloc[0:4]
============================================
练习9:
分析比较Series和DataFrame各种索引的方式,熟练掌握.loc()方法
假设张三再一次在期中考试的时候因为特殊原因放弃英语考试,如何实现?
============================================
stack()
unstack()
df
df1 = df.unstack(level=2)
df1
df1.stack(level=1)
【小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
============================================
练习10:
使用unstack()将ddd变为两行,分别为期中期末
使用unstack()将ddd变为四行,分别为四个科目
============================================
【注意】
需要指定axis
【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留。
所谓的聚合操作:平均数,方差,最大值,最小值……
df
df.div(10)
df.divide(10,axis=1)
df.sum(axis=1)
df.std(axis=0)
df.where(df>50,other=0) # 这个函数是根据条件来过滤
============================================
练习11:
计算各个科目期中期末平均成绩
计算各科目张三李四的最高分
============================================