Python 如何正确使用带有级别和轴参数的索引?
关于此df: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
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)