数据分析学习笔记之索引

创建方式

MultiIndex,即具有多个层次的索引,有些类似于根据索引进行分组的形式。通过多层次索引,我们就可以使用高层次的索引,来操作整个索引组的数据。

第一种

我们在创建Series或DataFrame时,可以通过给index(columns)参数传递多维数组,进而构建多维索引。【数组中每个维度对应位置的元素,组成每个索引值】
多维索引的也可以设置名称(names属性),属性的值为一维数组,元素的个数需要与索引的层数相同(每层索引都需要具有一个名称)。

第二种

我们可以通过MultiIndex类的相关方法,预先创建一个MultiIndex对象,然后作为Series与DataFrame中的index(或columns)参数值。同时,可以通过names参数指定多层索引的名称。

  • from_arrays:接收一个多维数组参数,高维指定高层索引,低维指定底层索引。
  • from_tuples:接收一个元组的列表,每个元组指定每个索引(高维索引,低维索引)。
  • from_product:接收一个可迭代对象的列表,根据多个可迭代对象元素的笛卡尔积进行创建索引。

from_product相对于前两个方法而言,实现相对简单,但是,也存在局限。

# 第一种
# 在创建Series或DataFrame对象时,通过index参数指定二维的数组类型。其中每个元素(一维数组类型)
# 来指定每个层次的索引内容(索引标签)。
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(4, 4), index=[["上半年", "上半年", "下半年", "下半年"], ["第一季度", "第二季度", "第三季度", "第四季度"]],columns=[["水果", "水果", "蔬菜", "蔬菜"], ["苹果", "香蕉", "白菜", "萝卜"]])
display(df)

结果如下:
在这里插入图片描述
注意,Series和DataFrame的索引对象可以具有名字。当索引是单层时,可以给index的name属性赋值。
s = pd.Series([1, 2, 3, 4], index=["a","a", "b", "b"], name="Series的name")
当索引是多层时,可以给index的names属性赋值,每层索引都需要有一个名字。

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

通过数组的方式创建。传递一个二维数组,每个元素(一维数组)指定相应的层次标签(一个元素指定一个层次)。

mindex = pd.MultiIndex.from_arrays([["上半年", "上半年", "下半年", "下半年"], ["第一季度", "第二季度", "第三季度", "第四季度"]],names=["年度", "季度"])

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

mindex = pd.MultiIndex.from_tuples([("上半年", "第一季度"),("上半年", "第二季度"),("下半年", "第三季度"), ("下半年", "第四季度")])

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

mindex = pd.MultiIndex.from_product([["2017", "2018"], ["上半年", "下半年"]])

多层索引操作

对于多层索引,同样也支持单层索引的相关操作,例如,索引元素,切片,索引数组选择元素等。我们也可以根据多级索引,按层次逐级选择元素。

多层索引的优势:通过创建多层索引,我们就可以使用高层次的索引,来操作整个索引组的数据。
格式:

  • s[操作]
  • s.loc[操作]
  • s.iloc[操作]

其中,操作可以是索引,切片,数组索引,布尔索引。

Series多层索引

  • 通过loc(标签索引)操作,可以通过多层索引,获取该索引所对应的一组值。
  • 通过iloc(位置索引)操作,会获取对应位置的元素值(与是否多层索引无关)。
  • 通过s[操作]的行为有些诡异,建议不用。
  • 对于索引(单级),首先按照标签选择,如果标签不存在,则按照位置选择。
  • 对于多级索引,则按照标签进行选择。
  • 对于切片,如果提供的是整数,则按照位置选择,否则按照标签选择。
  • 对于数组索引, 如果数组元素都是整数,则根据位置进行索引,否则,根据标签进行索引(此时如果标签不存在,也不会出现错误)。

下面看一个例子。

df = pd.DataFrame(np.random.random((4,4)),index=[1,2,3,4],columns=["a","b","c","d"])
display(df)
display(df.loc[1:3,"a":"c"])//标签索引,一到三行,a到c列。
display(df.iloc[1:4,2:4])//位置索引,同理。

在这里插入图片描述

DataFrame多层索引

  • 通过loc(标签索引)操作,可以通过多层索引,获取该索引所对应的一组值。
  • 通过iloc(位置索引)操作,会获取对应位置的一行(与是否多层索引无关)。
  • 通过s[操作]的行为有些诡异,建议不用。
  • 对于索引,根据标签获取相应的列(如果是多层索引,则可以获得多列)。
  • 对于数组索引, 根据标签,获取相应的列(如果是多层索引,则可以获得多列)。
  • 对于切片,首先按照标签进行索引,然后再按照位置进行索引(取行)。

交换索引

我们可以调用DataFrame对象的swaplevel方法来交换两个层级索引。该方法默认对倒数第2层与倒数第1层进行交换。我们也可以指定交换的层。层次从0开始,由外向内递增(或者由上到下递增),也可以指定负值,负值表示倒数第n层。除此之外,我们也可以使用层次索引的名称来进行交换。

索引排序

我们可以使用sort_index方法对索引进行排序处理。

  • level:指定根据哪一层进行排序,默认为最外(上)层。该值可以是数值,索引名,或者是由二者构成的列表。
  • inplace:是否就地修改。默认为False。

索引堆叠

通过DataFrame对象的stack方法,可以进行索引堆叠,即将指定层级的列转换成行。
level:指定转换的层级,默认为-1。

取消堆叠

通过DataFrame对象的unstack方法,可以取消索引堆叠,即将指定层级的行转换成列。
level:指定转换的层级,默认为-1。
fill_value:指定填充值。默认为NaN。在取消堆叠的过程中,可能会产生空值,我们可以使用fill_value进行填充。

设置索引

在DataFrame中,如果我们需要将现有的某一(几)列作为索引列,可以调用set_index方法来实现。

  • drop:是否丢弃作为新索引的列,默认为True。
  • append:是否以追加的方式设置索引,默认为False。
  • inplace:是否就地修改,默认为False。

重制索引

调用在DataFrame对象的reset_index,可以重置索引。该操作与set_index正好相反。

  • level:重置索引的层级,默认重置所有层级的索引。如果重置所有索引,将会创建默认整数序列索引。
  • drop:是否丢弃重置的索引列,默认为False。
  • inplace:是否就地修改,默认为False。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值