Pandas进阶

本章介绍pandas层次化索引,索引的堆(stack),以及多层索引聚合操作,拼接操作

创建多层行索引

隐式构造

最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组

1
2
3
4
5
6
data = np.random.randint(0,150,size=(6,6))
index = [['一班','一班','一班','二班','二班','二班'],['张三', '李四', '王五', '赵六', '田七', '孙八']]
columns = [['期中','期中','期中','期末','期末','期末'],['语文','数学','英语','语文','数学','英语']]
df = DataFrame(columns=columns,index=index,data=data)
df

image-20220711162043742

  • Series也可以创建多层索引
1
2
3
4
index = [['一班', '一班', '一班', '二班', '二班', '二班'], ['张三', '李四', '王五', '赵六', '田七', '孙八']]
data = np.random.randint(0,150, size=6)
s = Series(data=data, index=index)
s

image-20220711162635182

显示构造pd.MultiIndex

  • 使用数组
1
2
3
4
5
6
data = np.random.randint(0,150, size=(6,6))

index = pd.MultiIndex.from_arrays([['一班', '一班', '一班', '二班', '二班', '二班'], ['张三', '李四', '王五', '赵六', '田七', '孙八']])
columns = pd.MultiIndex.from_arrays([['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语']])
df = DataFrame(index=index, data=data, columns=columns)
df

image-20220712135538144

  • 使用tuple
1
2
3
4
5
6
data = np.random.randint(0,150, size=(6,6))

index = pd.MultiIndex.from_tuples([('一班', '张三'), ('一班', '李四'), ('一班', '王五'), ('二班', '赵六'), ('二班', '田七'), ('二班', '孙八')])
columns = pd.MultiIndex.from_arrays([['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语']])
df = DataFrame(index=index, data=data, columns=columns)
df

image-20220712135613233

  • 使用product
1
2
3
4
5
6
7
data = np.random.randint(0,150, size=(6,6))

#product 两两相乘,必须有一样的,如果没有一样的,只能使用上面2种
index = pd.MultiIndex.from_product([['一班', '二班'], ['张三', '李四', '王五']])
columns = pd.MultiIndex.from_arrays([['期中', '期中', '期中', '期末', '期末', '期末'], ['语文', '数学', '英语', '语文', '数学', '英语']])
df = DataFrame(index=index, data=data, columns=columns)
df

image-20220712142355726

多层索引对象的索引与切片操作

Series的操作

【重要】对于Series来说,直接中括号[]与使用.loc()完全一样,推荐使用中括号索引和切片。

image-20220712154123722

索引

原则: 当有多层索引的时候,不要直接索引内层索引.

1
2
# 先索引外层索引 推荐写法
s.loc['一班', '张三']

image-20220712154250028

切片

image-20220712160244074

DataFrame的操作

可以直接使用列名称来进行列索引

image-20220712161801042

行多级索引的索引和切片操作

image-20220712162311855

列多级索引的索引和切片操作

image-20220712162441453

image-20220712162449968

【极其重要】推荐使用loc()函数

注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!

索引的堆

  • stack()
  • unstack()

索引的堆指的就是 多层索引中行索引和列索引的转化

image-20220712165413101

1
2
# 默认level 是-1  
df.stack()

image-20220712170023470

1
df.stack(level=0)

image-20220712170104141

1
df.unstack()

image-20220712170438379

1
2
【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
level的顺序 如下 可以是正序:0,1,2 也可以是倒序:-1,-2,-3

image-20220712170512946

聚合操作

所谓的聚合操作:平均数,方差,最大值,最小值……

1
sum / min /max / mean  / std/ var/ prod/ median / percentile....

image-20220713135057654

image-20220713135139465

1
2
3
4
5
# 一班二班,各科成绩的和.
# 新版本改成了groupby
# df.sum(axis=0, level=0) # 不推荐使用了
df.groupby(level=0,axis=0).sum()
# 先根据axis的值看对行还是对列进行 操作. 再去看level, level等于哪一层 ,哪一层就保留下来.

【注意】

  • 需要指定axis
  • 【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留。