gpt4 book ai didi

python - 在尊重其索引结构的同时对多索引进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 10:31:15 25 4
gpt4 key购买 nike

如何在尊重级别组织的同时对多索引数据框进行排序?

例如给定以下 df,假设我们根据 C 对其进行排序(例如按降序排列):

                   C         D  E
A B
bar one -0.346528 1.528538 1
three -0.136710 -0.147842 1
flux six 0.795641 -1.610137 1
three 1.051926 -1.316725 2
foo five 0.906627 0.717922 0
one -0.152901 -0.043107 2
two 0.542137 -0.373016 2
two 0.329831 1.067820 1

我们应该得到:

                   C         D  E
A B
bar three -0.136710 -0.147842 1
one -0.346528 1.528538 1
flux three 1.051926 -1.316725 2
six 0.795641 -1.610137 1
foo five 0.906627 0.717922 0
two 0.542137 -0.373016 2
two 0.329831 1.067820 1
two -0.152901 -0.043107 2

请注意,我所说的“尊重其索引结构”的意思是在不更改更高级别索引的顺序的情况下对数据框的叶子进行排序。换句话说,我想对第二级进行排序,同时保持第一级的顺序不变。

升序顺序做同样的事情怎么样?

我阅读了这两个主题(是的,标题相同):

但他们根据不同的标准(例如索引名称或组中的特定列)对数据帧进行排序。

最佳答案

.reset_index,然后根据AC列排序,然后设置索引;这将比早期的 groupby 解决方案更有效:

>>> df.reset_index().sort(columns=['A', 'C'], ascending=[True, False]).set_index(['A', 'B'])
C D E
A B
bar three -0.137 -0.148 1
one -0.347 1.529 1
flux three 1.052 -1.317 2
six 0.796 -1.610 1
foo five 0.907 0.718 0
two 0.542 -0.373 2
two 0.330 1.068 1
one -0.153 -0.043 2

较早的解决方案:.groupby(...).apply 相对较慢,并且可能无法很好地扩展:

>>> df['arg-sort'] = df.groupby(level='A')['C'].apply(pd.Series.argsort)
>>> f = lambda obj: obj.iloc[obj.loc[::-1, 'arg-sort'], :]
>>> df.groupby(level='A', group_keys=False).apply(f)
C D E arg-sort
A B
bar three -0.137 -0.148 1 1
one -0.347 1.529 1 0
flux three 1.052 -1.317 2 1
six 0.796 -1.610 1 0
foo five 0.907 0.718 0 1
two 0.542 -0.373 2 2
two 0.330 1.068 1 0
one -0.153 -0.043 2 3

关于python - 在尊重其索引结构的同时对多索引进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26350723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com