python如何多重index求和 dataframe多重index索引取值_dataframe切片

一,多层级索引的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

python如何多重index求和 dataframe多重index索引取值_python如何多重index求和_02

二,多层级索引的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>>>

python如何多重index求和 dataframe多重index索引取值_python如何多重index求和_03

  • 行的取值:
>>> 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(),是直接取值多层级数据极有效的方法,简洁、易懂。

python如何多重index求和 dataframe多重index索引取值_pandas dataframe_04