大熊猫:切片具有多个索引的Multindex

sve*_*esh 4 python indexing slice pandas

我有一个d关于100,000,000行和3列的数据框。看起来像这样:

import pandas as pd 

In [17]: d = pd.DataFrame({'id': ['a', 'b', 'c', 'd', 'e'], 'val': [1, 2, 3, 4, 5], 'n': [34, 22, 95, 86, 44]}) 

In [18]: d.set_index(['id', 'val'], inplace = True)
Run Code Online (Sandbox Code Playgroud)

我还有另一个要保留的数据框,其值是id和。有60万左右的组合,和我想保留:valdidval

In [20]: keep = pd.DataFrame({'id':['a', 'b'], 'val' : [1, 2]})
Run Code Online (Sandbox Code Playgroud)

我已经通过以下方式尝试过:

In [21]: keep.set_index(['id', 'val'], inplace = True)

In [22]: d.loc[d.index.isin(keep.index), :] 
Out [22]:         
                   n
         id val    
          a  1    34
          b  2    22
Run Code Online (Sandbox Code Playgroud)

该方法有效,但看起来笨拙且非常慢。这里有更好的方法吗?在熊猫上切片Multindex的最快方法是什么?

piR*_*red 5

loc 接受一个元组列表以引用一个 MultiIndex

d.loc[[*keep.itertuples(index=False)]]

         n
id val    
a  1    34
b  2    22
Run Code Online (Sandbox Code Playgroud)

做同样事情的更讨厌的方式。(实际上不是推荐)

d.loc[[*zip(*map(keep.get, keep))]]

         n
id val    
a  1    34
b  2    22
Run Code Online (Sandbox Code Playgroud)

优点是少了3个字符。您只需要牺牲对正在发生的事情的理解。


WeN*_*Ben 5

使用 reindex

d.reindex(pd.MultiIndex.from_frame(keep))
Out[151]: 
         n
id val    
a  1    34
b  2    22
Run Code Online (Sandbox Code Playgroud)