Python 如何正确使用带有级别和轴参数的索引?

Python 如何正确使用带有级别和轴参数的索引?,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,关于此df: Amount type Month_year 2019-06-01 2019-07-01 2019-06-01 2019-07-01 TYPE_ID 1 2 1 2 1 2 1 2 ID

关于此df:

               Amount                          type                 
Month_year 2019-06-01     2019-07-01     2019-06-01    2019-07-01   
TYPE_ID             1   2          1   2          1  2          1  2
ID                                                                  
100                20  10         40  20          1  1          2  1
200                80  60         30  10          2  2          1  1
以下代码:

df = df.sort_index(axis=1, level=[1,2])
产生以下结果:

               Amount       type     Amount  ...       type     Amount       type
Month_year 2019-06-01 2019-06-01 2019-06-01  ... 2019-07-01 2019-07-01 2019-07-01
TYPE_ID             1          1          2  ...          1          2          2
ID                                           ...                                 
100                20          1         10  ...          2         20          1
200                80          2         60  ...          1         10          1
我真的不明白发生了什么事。我读过,但没有例子,描述也很模糊

谁能给我解释一下这个方法是如何工作的,我是如何得到这个结果的

轴为1的sort_index对列标题进行排序,然后使用此排序设置列的顺序

而且,必然的结果是

轴为0的sort_index对索引进行排序,然后使用此排序设置行的顺序

这是您的输入df的外观:

上图中的前三行对应于df的多索引列,如下所示:

df.columns
MultiIndex([('Amount', '2019-06-01', 1),
            ('Amount', '2019-06-01', 2),
            ('Amount', '2019-07-01', 1),
            ('Amount', '2019-07-01', 2),
            (  'type', '2019-06-01', 1),
            (  'type', '2019-06-01', 2),
            (  'type', '2019-07-01', 1),
            (  'type', '2019-07-01', 2)])
让我们假设您的3级多索引列被神奇地转换为一个数据帧,每个级别都有自己的称为cdf的列:

这里的行号对应于原始数据帧中的列标识符。让我们看看按最后两列对cdf排序时会发生什么:

cdf.sort_values(['level_1', 'level_2'])

    level_0     level_1  level_2
(1)  Amount  2019-06-01        1
(5)    type  2019-06-01        1
(2)  Amount  2019-06-01        2
(6)    type  2019-06-01        2
(3)  Amount  2019-07-01        1
(7)    type  2019-07-01        1
(4)  Amount  2019-07-01        2
(8)    type  2019-07-01        2
请注意已排序cdf的索引:

现在,让我们看看将sort_index操作应用于df时会发生什么:

中间的省略号表示,由于终端的宽度,并非所有列都可以显示。事实上,第6列和第3列没有显示,但它们非常多,但这不是有趣的部分。将这里的列顺序与排序后的cdf的行顺序进行对比,您会发现它们是相同的

本质上

轴为1的sort_index对列标题进行排序,然后使用此排序设置列的顺序

而且,必然的结果是

轴为0的sort_index对索引进行排序,然后使用此排序设置行的顺序

这是您的输入df的外观:

上图中的前三行对应于df的多索引列,如下所示:

df.columns
MultiIndex([('Amount', '2019-06-01', 1),
            ('Amount', '2019-06-01', 2),
            ('Amount', '2019-07-01', 1),
            ('Amount', '2019-07-01', 2),
            (  'type', '2019-06-01', 1),
            (  'type', '2019-06-01', 2),
            (  'type', '2019-07-01', 1),
            (  'type', '2019-07-01', 2)])
让我们假设您的3级多索引列被神奇地转换为一个数据帧,每个级别都有自己的称为cdf的列:

这里的行号对应于原始数据帧中的列标识符。让我们看看按最后两列对cdf排序时会发生什么:

cdf.sort_values(['level_1', 'level_2'])

    level_0     level_1  level_2
(1)  Amount  2019-06-01        1
(5)    type  2019-06-01        1
(2)  Amount  2019-06-01        2
(6)    type  2019-06-01        2
(3)  Amount  2019-07-01        1
(7)    type  2019-07-01        1
(4)  Amount  2019-07-01        2
(8)    type  2019-07-01        2
请注意已排序cdf的索引:

现在,让我们看看将sort_index操作应用于df时会发生什么:


中间的省略号表示,由于终端的宽度,并非所有列都可以显示。事实上,第6列和第3列没有显示,但它们非常多,但这不是有趣的部分。将这里的列顺序与排序后的cdf的行顺序进行对比,您会发现它们是相同的

它对列进行排序,首先按级别排序=1个月-年,然后按级别字母顺序排序2@ansev谢谢轴心呢?为什么当axis=0时,数据帧保持不变?它到底做什么?轴=0,按index@ansev我不明白。你能详细说明一下吗?这里的索引是ID,分别是100和200,数据集似乎已经按索引排序了。对已经排序的数据集进行排序不会改变任何事情。它是对列进行排序,第一个按级别排序=1个月-年,然后按级别字母顺序排序2@ansev谢谢轴心呢?为什么当axis=0时,数据帧保持不变?它到底做什么?轴=0,按index@ansev我不明白。你能详细说明一下吗?这里的索引是ID,分别是100和200,数据集似乎已经按索引排序了。对已排序的数据集进行排序不会改变任何内容。
df.sort_index(level=[1, 2], axis=1)