根据列值对带有 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我在我的初始数据集上使用了groupby
和sum
函数后得到了它。
我想保持相同的格式,但按照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_values
与 reset_index
和 set_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 进行排序的主要内容,如果未能解决你的问题,请参考以下文章
Pandas Dataframe Multiindex 按级别和列值排序