gpt4 book ai didi

Python Pandas 按多索引和列排序

转载 作者:太空狗 更新时间:2023-10-29 20:58:29 24 4
gpt4 key购买 nike

在 Pandas 0.17 中,我尝试按特定列排序,同时保持层次索引(A 和 B)。 B 是通过串联设置数据帧时创建的运行编号。我的数据如下所示:

          C      D
A B
bar one shiny 10
two dull 5
three glossy 8
foo one dull 3
two shiny 9
three matt 12

这是我需要的:

          C      D
A B
bar two dull 5
three glossy 8
one shiny 10
foo one dull 3
three matt 12
two shiny 9

下面是我使用的代码和结果。注意:Pandas 0.17 警告 dataframe.sort 将被弃用。

df.sort_values(by="C", ascending=True)
C D
A B
bar two dull 5
foo one dull 3
bar three glossy 8
foo three matt 12
bar one shiny 10
foo two shiny 9

添加 .groupby 产生相同的结果:

df.sort_values(by="C", ascending=True).groupby(axis=0, level=0, as_index=True)

同样,切换到先对索引进行排序,然后对列进行分组也没有效果:

df.sort_index(axis=0, level=0, as_index=True).groupby(C, as_index=True)

我不确定重新索引我需要保留第一个索引 A,第二个索引 B 可以重新分配,但不是必须的。如果没有一个简单的解决方案,我会感到惊讶;我想我只是找不到它。任何建议表示赞赏。


编辑:与此同时,我删除了第二个索引 B,将第一个索引 A 重新分配为一列,而不是对多列进行排序的索引,然后重新为其编制索引:

df.index = df.index.droplevel(1)
df.reset_index(level=0, inplace=True)
df_sorted = df.sort_values(["A", "C"], ascending=[1,1]) #A is a column here, not an index.
df_reindexed = df_sorted.set_index("A")

还是很冗长。

最佳答案

感觉可能有更好的方法,但这是一种方法:

In [163]: def sorter(sub_df):
...: sub_df = sub_df.sort_values('C')
...: sub_df.index = sub_df.index.droplevel(0)
...: return sub_df

In [164]: df.groupby(level='A').apply(sorter)
Out[164]:
C D
A B
bar two dull 5
three glossy 8
one shiny 10
foo one dull 3
three matt 12
two shiny 9

关于Python Pandas 按多索引和列排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33190633/

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