一,多层级索引的Series的取值
创建示例数据:
import numpy as pyimport pandas as pdsr=pd.Series([78,89,75,88], index=[['宁晨','宁晨','艾然','艾然'], ['语文','数学','语文','数学']])sr.index.names=['姓名','科目']
查询示例:方括号直接取值、.loc取值、pd.IndexSlice切片取值
>>> sr姓名 科目宁晨 语文 78 数学 89艾然 语文 75 数学 88dtype: int64>>> sr['宁晨']科目语文 78数学 89dtype: int64>>> sr['宁晨','语文']78>>> sr['宁晨']['语文']78>>> sr[:,'数学']姓名宁晨 89艾然 88dtype: int64>>> sr.loc[pd.IndexSlice[:,'数学']]姓名宁晨 89艾然 88dtype: int64
二,多层级索引的DataFrame的取值
创建示例数据:
df=pd.DataFrame(np.random.randint(60,100,size=(4,4)), columns=pd.MultiIndex.from_product([['语文','数学'],['第一学期','第二学期']]), index=pd.MultiIndex.from_tuples([('班级1','宁晨'),('班级1','艾然'), ('班级2','大道'),('班级2','至简')]))df.index.names=['class','name']>>> df 语文 数学 第一学期 第二学期 第一学期 第二学期class name 班级1 宁晨 69 64 92 80 艾然 70 66 86 61班级2 大道 81 80 73 73 至简 84 89 93 95
取值方法:[]直接取值、.loc取值、pd.IndexSlice切片取值、get_level_values()方法取值、query()方法取值。
- 列的取值:
>>> df['语文'] 第一学期 第二学期class name 班级1 宁晨 69 64 艾然 70 66班级2 大道 81 80 至简 84 89>>> df['语文']['第二学期']class name班级1 宁晨 64 艾然 66班级2 大道 80 至简 89Name: 第二学期, dtype: int64>>> df['语文','第二学期']class name班级1 宁晨 64 艾然 66班级2 大道 80 至简 89Name: (语文, 第二学期), dtype: int64df[['语文','数学']] 语文 数学 第一学期 第二学期 第一学期 第二学期class name 班级1 宁晨 69 64 92 80 艾然 70 66 86 61班级2 大道 81 80 73 73 至简 84 89 93 95
[]不能直接引用到第二层级的数据,但可以通过pd.IndexSlice切片方法和get_level_values()方法来实现。
df['第二学期']Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pandas/core/indexes/base.py", line 2891, in get_loc return self._engine.get_loc(casted_key) File "pandas/_libs/index.pyx", line 70, in pandas._libs.index.IndexEngine.get_loc File "pandas/_libs/index.pyx", line 101, in pandas._libs.index.IndexEngine.get_loc File "pandas/_libs/hashtable_class_helper.pxi", line 1675, in pandas._libs.hashtable.PyObjectHashTable.get_item File "pandas/_libs/hashtable_class_helper.pxi", line 1683, in pandas._libs.hashtable.PyObjectHashTable.get_itemKeyError: '第二学期'>>> df.loc[:,pd.IndexSlice[:,'第二学期']] 语文 数学 第二学期 第二学期class name 班级1 宁晨 64 80 艾然 66 61班级2 大道 80 73 至简 89 95>>> df.loc[pd.IndexSlice[:,'艾然'],pd.IndexSlice[:,'第二学期']] 语文 数学 第二学期 第二学期class name 班级1 艾然 66 61>>> df.loc[df.columns.get_level_values(1)=='第二学期'] 语文 数学 第一学期 第二学期 第一学期 第二学期class name 班级1 艾然 88 97 93 72班级2 至简 85 70 70 91>>>
- 行的取值:
>>> df.loc['班级2'] 语文 数学 第一学期 第二学期 第一学期 第二学期name 大道 81 80 73 73至简 84 89 93 95>>> df.loc[('班级2','至简'),:]语文 第一学期 84 第二学期 89数学 第一学期 93 第二学期 95Name: (班级2, 至简), dtype: int64>>> df.loc[('班级1','宁晨'),('数学','第一学期')]9
pd.IndexSlice切片和get_level_values()方法,对于行取值一样适用。
df.loc[pd.IndexSlice[:,'艾然'],:] 语文 数学 第一学期 第二学期 第一学期 第二学期class name 班级1 艾然 70 66 86 61>>> df.loc[pd.IndexSlice[:,'艾然'],'数学'] 第一学期 第二学期class name 班级1 艾然 86 61>>> df.loc[df.index.get_level_values(1)=='宁晨'] 语文 数学 第一学期 第二学期 第一学期 第二学期class name 班级1 宁晨 92 90 62 72>>> df.query("name=='艾然'")#指定索引层级名称的值 语文 数学 第一学期 第二学期 第一学期 第二学期class name 班级1 艾然 88 97 93 72>>>
启示:
pd.IndexSlice[]方法、df.query()、get_level_values(),是直接取值多层级数据极有效的方法,简洁、易懂。