数据分析5--多层索引与分组聚合

一、多层索引

MultiIndex,即具有多个层次的索引,有些类似于根据索引进行分组的形式。通过多层次索引,我们就可以使用高层次的索引,来操作整个索引组的数据。
多层索引的创建方式
第一种创建多层索引方式:
我们在创建Series或DataFrame时,可以通过给index(columns)参数传递多维数组,进而构建多维索引。【数组中每个维度对应位置的元素,组成每个索引值】
多维索引的也可以设置名称(names属性),属性的值为一维数组,元素的个数需要与索引的层数相同(每层索引都需要具有一个名称)。

s1 = pd.Series([1,2,3,4],index = [["A","A","B","B"],["a","b","a","b"],["a1","a2","b1","b2"]])
display(s1)

输出:

A  a  a1    1
   b  a2    2
B  a  b1    3
   b  b2    4
dtype: int64

DataFrame的多层索引创建

df1 = pd.DataFrame(np.arange(16).reshape(4,4),
                   index = [["上半年","上半年","下半年","下半年"],["第一季度","第二季度","第三季度","第四季度"]],
                   columns = [["蔬菜","蔬菜","水果","水果"],["白菜","萝卜","苹果","梨子"]])
display(df1)

输出:
在这里插入图片描述

df1.index,df1.columns

输出:

(MultiIndex([('上半年', '第一季度'),
             ('上半年', '第二季度'),
             ('下半年', '第三季度'),
             ('下半年', '第四季度')],
            ),
 MultiIndex([('蔬菜', '白菜'),
             ('蔬菜', '萝卜'),
             ('水果', '苹果'),
             ('水果', '梨子')],
            ))

Series/DataFrame的索引对象可以具有名字。当索引是单层时,可以给index的name属性赋值。

s = pd.Series([1,2,3,4],index = ["a","b","c","d"])
s.index.name = "Index_Name"
s

输出:

Index_Name
a    1
b    2
c    3
d    4
dtype: int64

当索引是多层时,可以给index的names属性赋值。(每层索引都需要具有一个名字)

s = pd.Series([1,2,3,4],index = [["A","B","A","B"],["a","b","a","b"]],name = "name1")
s.index.names=["outer","inner"]
s

输出:

outer  inner
A      a        1
B      b        2
A      a        3
B      b        4
Name: name1, dtype: int64
df1 = pd.DataFrame(np.arange(16).reshape(4,4),
                   index = [["上半年","上半年","下半年","下半年"],["第一季度","第二季度","第三季度","第四季度"]],
                   columns = [["蔬菜","蔬菜","水果","水果"],["白菜","萝卜","苹果","梨子"]])
df1.index.names=["年度","季度"]
df1.columns.names = ["分类","品种"]
df1

输出:
在这里插入图片描述
第二种创建多层索引方式:
我们可以通过MultiIndex类的相关方法,预先创建一个MultiIndex对象,然后作为Series与DataFrame中的index(或columns)参数值。同时,可以通过names参数指定多层索引的名称
from_arrays:接收一个多维数组参数,高维指定高层索引,低维指定底层索引。
from_tuples:接收一个元组的列表,每个元组指定每个索引(高维索引,低维索引)。
from_product:接收一个可迭代对象的列表,根据多个可迭代对象元素的笛卡尔积进行创建索引。
from_product相对于前两个方法而言,实现相对简单,但是,也存在局限。

from_arrays:接收一个多维数组参数,高维指定高层索引,低维指定底层索引。

mindex = pd.MultiIndex.from_arrays([["上半年","上半年","下半年","下半年"],["第一季度","第二季度","第三季度","第四季度"]],
                                   names=["年度","季度"])
mcolumn =pd.MultiIndex.from_arrays([["蔬菜","蔬菜","水果","水果"],["白菜","萝卜","苹果","梨子"]],names=["分类","品种"])
df1 = pd.DataFrame(np.arange(16).reshape(4,4),index = mindex,columns =mcolumn)
display(df1)

输出:

在这里插入图片描述
2 通过元组的方式创建。传输传递一个(嵌套的)可迭代对象,每个元素是一个元组。
from_arrays可以看做是纵向的方式来指定索引标签。而from_tuples可以看做是横向的方式来指定索引标签。

mindex = pd.MultiIndex.from_tuples([("上半年","第一季度"),("上半年","第二季度"),("下半年","第三季度"),("下半年","第四季度")],
                                   names=["年度","季度"])
mcolumn = pd.MultiIndex.from_tuples([("蔬菜","白菜"),("蔬菜","萝卜"),("水果","苹果"),("水果","梨子")],names=["品类","品种"])
df1 = pd.DataFrame(np.arange(16).reshape(4,4),index=mindex,columns=mcolumn)
df1

输出:
在这里插入图片描述

3 通过笛卡尔积的方式创建。传递一个嵌套的可迭代对象。每个内层的元素采用笛卡尔积的方式组合
第3种方式相比与前两种方式,较简单,但是,也存在局限(必须每种组合都要存在)。

mindex = pd.MultiIndex.from_product([["2018","2019"],["上半年","下半年"]],names=["年度","半年度"])
df1 = pd.DataFrame(np.arange(16).reshape(4,4),index=mindex)
df1

输出:
在这里插入图片描述

二、多层索引操作

对于多层索引,同样也支持单层索引的相关操作,例如,索引元素,切片,索引数组选择元素等。我们也可以根据多级索引,按层次逐级选择元素。
多层索引的优势:通过创建多层索引,我们就可以使用高层次的索引,来操作整个索引组的数据。
格式如下:
s[操作]
s.loc[操作]
s.iloc[操作]
其中,操作可以是索引,切片,数组索引,布尔索引

s = pd.Series([1,2,3,4],index = [["a","a","b","b"],[1
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值