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.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.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)