根据列值对带有 MultiIndex 的 pandas DataFrame 进行排序

Posted

技术标签:

【中文标题】根据列值对带有 MultiIndex 的 pandas DataFrame 进行排序【英文标题】:Sort pandas DataFrame with MultiIndex according to column value 【发布时间】:2017-09-14 06:57:25 【问题描述】:

在控制台中打印后,我有一个带有 MultiIndex 的 DataFrame:

值 indA indB 场景 ID 组 2015-04-13 1 A -54.0 1.0 1.0 B -160.0 1.0 1.0 C -15.0 0.0 1.0 2 A -83.0 1.0 1.0 3 A -80.0 2.0 2.0 4A -270.0 2.0 2.0 2015-04-14 1 A -56.0 1.0 1.0 B -1.0 1.0 1.0 C -60.0 0.0 1.0 2 安 -32.0 1.0 1.0 3 安 -91.0 2.0 2.0 4 A -17.0 2.0 2.0

我在我的初始数据集上使用了groupbysum 函数后得到了它。

我想保持相同的格式,但按照value 列排序。我已经努力使用排序功能来做到这一点,但我认为 MultiIndex 的第一个索引(用于日期)没有名称是一个问题。

基本上,输出应该是这样的:

值 indA indB 场景 ID 组 2015-04-13 1 B -160.0 1.0 1.0 A -54.0 1.0 1.0 C -15.0 0.0 1.0 2 A -83.0 1.0 1.0 3 A -80.0 2.0 2.0 4A -270.0 2.0 2.0 2015-04-14 1 C -60.0 1.0 1.0 A -56.0 1.0 1.0 B -1.0 0.0 1.0 2 安 -32.0 1.0 1.0 3 安 -91.0 2.0 2.0 4 A -17.0 2.0 2.0

有人能告诉我吗?

提前致谢。

【问题讨论】:

【参考方案1】:

你可以使用sort_values + sort_index:

print (df.sort_values('value').sort_index(level=[0,1], sort_remaining=False))
                             value  indA  indB
           scenarioId group                   
2015-04-13 1          B     -160.0   1.0   1.0
                      A      -54.0   1.0   1.0
                      C      -15.0   0.0   1.0
           2          A      -83.0   1.0   1.0
           3          A      -80.0   2.0   2.0
           4          A     -270.0   2.0   2.0
2015-04-14 1          C      -60.0   0.0   1.0
                      A      -56.0   1.0   1.0
                      B       -1.0   1.0   1.0
           2          A      -32.0   1.0   1.0
           3          A      -91.0   2.0   2.0
           4          A      -17.0   2.0   2.0

另一种解决方案 - sort_valuesreset_indexset_index

df = df.reset_index()
       .sort_values(['level_0','scenarioId','value'])
       .set_index(['level_0','scenarioId','group'])
print (df)
                             value  indA  indB
level_0    scenarioId group                   
2015-04-13 1          B     -160.0   1.0   1.0
                      A      -54.0   1.0   1.0
                      C      -15.0   0.0   1.0
           2          A      -83.0   1.0   1.0
           3          A      -80.0   2.0   2.0
           4          A     -270.0   2.0   2.0
2015-04-14 1          C      -60.0   0.0   1.0
                      A      -56.0   1.0   1.0
                      B       -1.0   1.0   1.0
           2          A      -32.0   1.0   1.0
           3          A      -91.0   2.0   2.0
           4          A      -17.0   2.0   2.0

【讨论】:

也许是一个与同一主题相关的快速问题:有没有一种简单的方法可以只保留数据框中的 2 个最小值?即对于场景1,仅在 2015 年 4 月 13 日保留 B 组和 A 组,在 2015 年 4 月 14 日保留 C 组和 A 组? 嗯,可以使用df = df.groupby(level=[0,1]).head(2),但所有组(我不确定是否需要) 或者可能需要df = df.groupby(level=0)['value'].nsmallest(2)

以上是关于根据列值对带有 MultiIndex 的 pandas DataFrame 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 bin Multiindex 获取最接近的列值?

Pandas Dataframe Multiindex 按级别和列值排序

根据列值对火花数据框进行分区?

使用 dplyr 根据列值对 R 中的值求和

如何根据列值对每一行显示复选框 - JQuery DataTable

根据 geom_tile() 热图中的两列值对行重新排序