按多索引python pandas dataframe在另一个数据fram上的出现顺序对其进行排序

2024-09-30 02:16:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的数据框df

                 a   b
 id   no   name   
T01  101   foo   1  $10
T32  102   bar   2  $30
T10  103   baz   4  $25

其中索引是id, no and name。我有另一个数据帧df2,其索引顺序与我希望的相同

^{pr2}$

我需要数据帧

                 a   b
 id   no   name  
T10  103   baz   4  $25 
T01  101   foo   1  $10
T32  102   bar   2  $30

我见过使用df.loc[df2.no.values]df.reindex(df2.no),但由于我有多索引的数据帧,它似乎不起作用

我应该用什么来按df2的顺序对键no中的df排序?在


Tags: and数据nonameiddffoo顺序
2条回答

解决方案

df.unstack([0, 2]).ix[df2.no].stack([1, 2]).swaplevel(0, 1)

说明

unstack([0, 2])将第一级和第三级索引放入[-2,-1]级的列中。这将隔离您关心的级别。在

ix[df2.no]按您喜欢的顺序排列剩余的级别。在

stack([1, 2])从列中获取级别并将它们放回索引中。在

swaplevel(0, 1)将索引级别恢复为原始顺序。在

一个可能的解决方案是^{}^{}和最后一个^{}

print df1.reset_index(level=['id','name'])
         .reindex(df2.no)
         .reset_index()
         .set_index(['id','no','name'])

              a    b
id  no  name        
T10 103 baz   4  $25
T01 101 foo   1  $10
T32 102 bar   2  $30

如果级别顺序不重要:

^{pr2}$

计时

In [77]: %timeit df1.unstack([0, 2]).ix[df2.no].stack([1, 2]).swaplevel(0, 1)
10 loops, best of 3: 18.8 ms per loop

In [78]: %timeit df1.reset_index(level=['id','name']).reindex(df2.no).reset_index().set_index(['id','no','name'])
The slowest run took 4.41 times longer than the fastest. This could mean that an intermediate result is being cached 
100 loops, best of 3: 4.41 ms per loop

相关问题 更多 >

    热门问题