【Python】pandas:索引(Index), 多索引(MultiIndex)

pandas是Python的扩展库(第三方库),为Python编程语言提供 高性能、易于使用的数据结构和数据分析工具。

pandas官方文档(MultiIndex):MultiIndex / advanced indexing — pandas 2.2.2 documentation (pydata.org)

帮助:可使用help(...)查看函数说明文档(若是第三方库的函数,需先导入库)。例如:help(pd.DataFrame)、help(pd.MultiIndex)。

附:索引


Python代码中,导入pandas:

import pandas as pd


1、查看索引属性

索引常用属性(Index包括index和columns)
Index.name索引名称
Index.values索引内容
Index.is_unique索引是否唯一
Index.dtype索引类型
Index.shape索引形状
Index.ndim索引维度
Index.size索引中数据数量
Index.memory_usage()索引使用内存情况

2、修改索引,数据不变:set_names, set_axis,  rename, rename_axis, add_prefix, add_suffix

(2-1)修改索引、索引名称:index, columns
  • DataFrame.index = 新index:修改索引(行索引),新index用数组/列表/元组形式表示。
  • DataFrame.columns = 新columns:修改列名(列索引),新columns用数组/列表/元组形式表示。
  • 注:只修改索引,数据不变。若需要索引名称,需重设。
  • DataFrame.index.name = 新index名称:设置索引(行索引)的名称。
  • DataFrame.columns.name = 新columns名称:设置列名(列索引)的名称。

 

也可以使用Index.set_names(...)修改索引名称。(Index包括index和columns)

Index.set_names(names, *, level=None, inplace=False)

注:默认inplace=False不替换原DataFrame。

  •  DataFrame.index.set_names(新index名称):设置索引(行索引)的名称。
  • DataFrame.columns.set_names(新columns名称):设置列名(列索引)的名称。

 (2-2)修改索引:set_axis

set_axis(self, labels, axis: 'Axis' = 0, inplace: 'bool' = False)

注:默认inplace=False 不替换原DataFrame。

  • DataFrame.set_axis(新行索引):修改行索引。
  • DataFrame.set_axis(新行索引, inplace=True):修改行索引。并替换原DataFrame。
  • DataFrame.set_axis(新列名, axis=1):修改列名。
  • 注:只修改索引,数据不变。若需要索引名称,需重设。


(2-3)修改索引、索引名称:rename、rename_axis

rename(self, mapper: 'Renamer | None' = None, *, index: 'Renamer | None' = None, columns: 'Renamer | None' = None, axis: 'Axis | None' = None, copy: 'bool' = True, inplace: 'bool' = False, level: 'Level | None' = None, errors: 'str' = 'ignore') -> 'DataFrame | None'

注:默认inplace=False 不替换原DataFrame。注意参数mapper。

  • DataFrame.rename(新索引):修改行索引。
  • DataFrame.rename(新索引, errors='raise'):修改行索引。若行索引不存在,则报错:KeyError: '[4] not found in axis'。
  • DataFrame.rename(新索引, inplace=True):修改行索引。并替换原DataFrame。
  • DataFrame.rename(新列名, axis=1):修改列索引。等效于:DataFrame.rename(新列名, axis='columns'),DataFrame.rename(columns=新列名)。
  • 注:只修改索引,数据不变。索引名称不变。

rename_axis(self, mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False)

注:默认inplace=False 不替换原DataFrame。注意参数mapper。

  • DataFrame.rename_axis(新行索引名称):修改行索引的名称。
  • DataFrame.rename_axis(新行索引名称, inplace=True):修改行索引的名称。并替换原DataFrame。
  • DataFrame.rename_axis(新列索引名称, axis=1):修改列索引的名称。并替换原DataFrame。等效于:DataFrame.rename_axis(新列索引名称, axis='columns'),DataFrame.rename_axis(columns=新列索引名称)。

 (2-4)给字符串列名添加前缀/后缀:add_prefix, add_suffix

add_prefix(self: 'NDFrameT', prefix: 'str') -> 'NDFrameT'

add_suffix(self: 'NDFrameT', suffix: 'str') -> 'NDFrameT'

  • DataFrame.add_prefix(指定前缀):给字符串列名添加前缀。
  • DataFrame.add_suffix(指定后缀):给字符串列名添加后缀。
  • 注:DataFrame只限于字符串类型的列名。数据不变。

3、修改索引、数据变化、可填充NaN值:reindex, reindex_like, align

(3-1)修改索引:reindex

reindex(self, labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)

  • DataFrame.reindex(新index):使用新索引,按新索引显示对应数据,新索引没有对应的数据则显示NaN值。
  • DataFrame.reindex(新index, fill_value=指定值):使用新索引,按新索引显示对应数据,新索引没有对应的数据则显示NaN值,NaN值用指定值填充。
  • DataFrame.reindex(新index, method=指定填充方式):使用新索引,按新索引显示对应数据,新索引没有对应的数据则显示NaN值,NaN值用指定填充方式填充。'pad'或'ffill'用指定轴上一个数据填充,'backfill'或'bfill'用指定轴下一个数据填充。
  • DataFrame.reindex(新columns, axis=1):使用新列名,按新列名显示对应数据,新列名没有对应的数据则显示NaN值。等效于:DataFrame.reindex(新columns, axis='columns'),DataFrame.reindex(columns=新columns)。
  • 注:按新索引显示对应数据,新索引没有对应数据则显示NaN值,NaN值可指定数值或指定填充方式填充。

(3-2)使用另一个DataFrame的索引:reindex_like

reindex_like(self: 'NDFrameT', other, method: 'str | None' = None, copy: 'bool_t' = True, limit=None, tolerance=None) -> 'NDFrameT'

  • DataFrame.reindex_like(other):使用另一个DataFrame的行列索引,按新行列索引显示对应数据,新行列索引没有对应数据则为NaN。
  • DataFrame.reindex_like(other, method=指定填充方式):使用另一个DataFrame的行列索引,按新行列索引显示对应数据,新行列索引没有对应数据则为NaN,NaN值用指定填充方式填充。填充方式:'pad'或'ffill','backfill'或'bfill','nearest'。
  • 注:按新行列索引显示对应数据,没有对应数据则显示NaN值,NaN值可指定填充方式填充。参数method只适用单调递增/递减的索引。

(3-3)两个DataFrame都使用合并后的索引:align

align(self, other, join: 'str' = 'outer', axis: 'Axis | None' = None, level: 'Level | None' = None, copy: 'bool' = True, fill_value=None, method: 'str | None' = None, limit=None, fill_axis: 'Axis' = 0, broadcast_axis: 'Axis | None' = None) -> 'DataFrame'

注:默认join='outer' 合并两DataFrame的索引。

  • DataFrame.align(other):两个DataFrame都使用合并后的行索引和列索引。索引没有对应数据的为NaN。
  • DataFrame.align(other, axis=0):两个DataFrame都使用合并后的行索引,列索引仍为各自原有的列索引。索引没有对应数据的为NaN。
  • DataFrame.align(other, axis=1):两个DataFrame都使用合并后的列索引,行索引仍为各自原有的行索引。索引没有对应数据的为NaN。
  • 注:返回元组(元素是DataFrame)。按新行/列索引显示对应数据,没有对应数据则显示NaN值。NaN值可指定数值或指定填充方式填充。

4、普通列设为索引列:set_index

set_index(self, keys, drop: 'bool' = True, append: 'bool' = False, inplace: 'bool' = False, verify_integrity: 'bool' = False)

注:默认inplace=False 不替换原DataFrame。

  • DataFrame.set_index(列名):将指定列作为索引列。将多列作为索引列,可使用列表形式。
  • DataFrame.set_index(列名, append=True):将指定列作为索引列,不覆盖原索引。将多列作为索引列,可使用列表形式。
  • DataFrame.set_index(列名, inplace=True):将指定列作为索引列,替换原DataFrame。
  • 注:默认覆盖原索引。若不覆盖原索引,需设置参数append=True。

5、取消索引列(即索引列转为普通列):reset_index

reset_index(self, level: 'Hashable | Sequence[Hashable] | None' = None, drop: 'bool' = False, inplace: 'bool' = False, col_level: 'Hashable' = 0, col_fill: 'Hashable' = '') -> 'DataFrame | None'

注:默认inplace=False 不替换原DataFrame。

  • DataFrame.reset_index():取消索引列,将索引列全部转为普通列。取消多列索引,可使用列表形式。
  • DataFrame.reset_index(level=指定索引列):取消指定索引列(level可用下标也可用索引名称),将指定索引列转为普通列。
  • DataFrame.reset_index(drop=True):取消索引列,并删除该列。
  • DataFrame.reset_index(inplace=True):取消索引列,将索引列转为普通列,替换原DataFrame。
  • 注:若索引列全部取消,则新索引为以0开始的连续数值。

6、索引排序

索引排序sort_index,参考:排序中的索引排序

 

判断索引是否已排序:(升序)is_monotonic_increasing,(降序)is_monotonic_decreasing

  • DataFrame.index.is_monotonic_increasing:判断行索引是否排序(从头到尾比对,都小于等于后一个索引)。
  • DataFrame.columns.is_monotonic_increasing:判断列索引是否排序(从头到尾比对,都小于等于后一个索引)。
  • 注:包括重复的索引。

其他判断索引是否排序的方法:

all(df.sort_index().index == df.index)
all(a <= b for a, b in zip(df.index, df.index[1:]))
all(df.index[:-1] <= df.index[1:]) 

 


多索引

多索引(MultiIndex):行索引/列索引是两行/列以上的索引。

多索引常用属性(MultiIndex包括index和columns)
MultiIndex.names多索引的名称
MultiIndex.levels多索引的内容(去重且排序)
MultiIndex.nlevels多索引的级别总数
MultiIndex.levshape多索引的形状
MultiIndex.dtypes多索引的各类型

1、创建多索引:from_arrays, from_tuples, from_product, from_frame
  • pd.MultiIndex.from_arrays(array, names=[列索引名称]):使用数组,创建多索引。
  • pd.MultiIndex.from_tuples(tuple, names=[列索引名称]):使用列表(元素是元组),创建多索引。
  • pd.MultiIndex.from_prodct(iterables, names=[列索引名称]):使用列表(元素是可迭代对象),两个可迭代对象的元素依次两两组合,创建多索引。(推荐)
  • pd.MultiIndex.from_frame(DataFrame, names=[列索引名称]):使用一个DataFrame,创建多索引。

 

将已有DataFrame的索引修改为多索引。

  • DataFrame.index = 多索引:将DataFrame的行索引设为多索引。
  • DataFrame.columns = 多索引:将DataFrame的列索引设为多索引。
  • DataFrame.index:查看索引(行索引)。
  • DataFrame.columns:查看列名(列索引)。
  • DataFrame.index.names:查看行多索引的名称。
  • DataFrame.columns.names:查看列多索引的名称。

2、获取每级索引的内容:get_level_values
  • MultiIndex.get_level_values(索引级别):级别的下标从0开始。通过下标获取相应索引的内容。
  • MultiIndex.get_level_values(索引名称):通过索引名称获取相应索引的内容。
  • 注:MultiIndex包括DataFrame.index和DataFrame.columns

3、通过索引获取数据

列索引为多索引:(获取整列数据)

  • DataFrame[ 第一级列索引 ]:获取第一级列索引相关的所有数据。
  • DataFrame[ 第一级列索引, 第二级列索引 ]:获取第一级列索引和第二级列索引相关的所有数据。等效于:DataFrame[ 第一级列索引 ][ 第二级列索引 ]。

行索引为多索引:(获取整行数据)

  • DataFrame.loc[ 第一级行索引 ]:获取第一级行索引相关的所有数据。
  • DataFrame.loc[ (第一级行索引, 第二级行索引) ]:元组形式,获取第一级行索引和第二级行索引相关的所有数据。

行索引和列索引都为多索引:

  • DataFrame.loc[ 行索引, 列索引 ]:通过行索引和列索引 获取相关的所有数据。若多个索引用列表形式,若多级索引用元组形式。

可用slice(None) 切割该级所有索引。slice(索引1, 索引2) 该级索引从索引1切割到索引2。

比起slice(None),更推荐使用pd.IndexSlice。 

loc中可以使用条件,根据布尔结果获取数据。

loc也可以使用axis指定轴,获取数据。 

  • DataFrame.loc(axis=0)[ 第一级行索引, 第二级行索引, ... ]:通过行索引获取整行数据。
  • DataFrame.loc(axis=1)[ 第一级列索引, 第二级列索引, ... ]:通过列索引获取整列数据。

可用xs更轻松地在索引中 使用参数level,获取数据。

  • DataFrame.xs(索引, level=索引名称):通过行索引 获取数据。
  • DataFrame.xs(索引, level=索引名称),  drop_level=False):通过行索引 获取数据。保留选择的索引。
  • DataFrame.xs(索引, level=索引名称, axis=1):通过列索引 获取数据。
  • DataFrame.xs( (索引1, 索引2,...), level=(索引名称1, 索引名称2), axis=指定轴 ):通过指定轴多级索引 获取数据。
  • 注:参数level也可以使用下标。

4、修改索引/索引名称
(4-1)修改索引/索引名称:index / columns,names / set_names(...)

使用index、columns修改索引,使用index.names、columns.names修改索引名称。也可以使用index.set_names(...)、columns.set_names(...)修改索引名称。数据不变。

 (4-2)修改索引/索引名称:rename,rename_axis

使用rename修改索引,使用rename_axis修改索引名称。数据不变。

(4-3)修改索引:reindex

使用reindex修改索引,数据根据索引变动


 

(4-4)合并两个DataFrame的索引:align

使用align合并两个DataFrame的索引,各自都可以使用合并后的索引。数据根据索引变动

(4-5)交换索引级别:swaplevel / reorder_levels

使用swaplevel或者reorder_levels交换索引级别。reorder_levels概括了swaplevel,并使用序列表示索引新级别顺序。

swaplevel(self, i: 'Axis' = -2, j: 'Axis' = -1, axis: 'Axis' = 0) -> 'DataFrame'

注:默认axis=0 行索引,i=-2,j=-1最后两列行索引交换。

  •  DataFrame.swaplevel( ):将最后两列行索引交换。
  •  DataFrame.swaplevel(axis=1):将最后两行列索引交换。
  •  DataFrame.swaplevel(索引级别1, 索引级别2):将指定两列行索引交换。
  •  DataFrame.swaplevel(索引级别1, 索引级别2, axis=1):将指定两行列索引交换。

reorder_levels(self, order: 'Sequence[Axis]', axis: 'Axis' = 0) -> 'DataFrame' 

注:默认axis=0 行索引。

  •  DataFrame.reorder_levels(新索引顺序):将行索引按新索引顺序(使用序列,如:列表)排列。
  •  DataFrame.reorder_levels(新索引顺序, axis=1):将列索引按新索引顺序(使用序列,如:列表)排列。
  • 注:可使用下标也可以使用索引名称。

(4-6)普通列与索引列之间转换:set_index、reset_index

使用set_index将普通列转为索引列(默认覆盖原索引),使用reset_index将索引转为普通列。

5、索引排序

通过is_monotonic_increasing判断索引是否升序排序(索引可重复),通过sort_index进行索引排序。


Index(含MultiIndex和DatetimeIndex)官方文档:Index objects — pandas 2.2.2 documentation (pydata.org)

DataFrame 各方法官方文档:DataFrame — pandas 2.2.2 documentation (pydata.org)

Series 各方法官方文档:Series — pandas 2.2.2 documentation (pydata.org)

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值