熊猫:切片多索引,有许多索引



我有一个数据帧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)

我有另一个值为 idval 的数据帧,我想将其保留在d中。我想保留大约 600,000 种idval的组合:

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

我通过以下方式尝试过:

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

这有效,但看起来很笨重,而且非常慢。这里有更好的方法吗?在大熊猫的多肠杆菌指数上切片的最快方法是什么?

使用 reindex

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

loc获取用于引用MultiIndex的元组列表

d.loc[[*keep.itertuples(index=False)]]
         n
id val    
a  1    34
b  2    22

做同样事情的更令人讨厌的方式。(实际上不是建议(

d.loc[[*zip(*map(keep.get, keep))]]
         n
id val    
a  1    34
b  2    22

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

使用 lockeep d进行索引

# d.loc[pd.MultiIndex.from_arrays([keep['id'], keep['val']]))]
d.reindex(pd.MultiIndex.from_arrays([keep['id'], keep['val']])))
         n
id val    
a  1    34
b  2    22

哪里

pd.MultiIndex.from_arrays([keep['id'], keep['val']])
MultiIndex(levels=[['a', 'b'], [1, 2]],
           codes=[[0, 1], [0, 1]],
           names=['id', 'val'])

从用于筛选的keep生成多索引。


另一种选择是尝试与df.merge合并:

d.merge(keep, left_index=True, right_on=['id', 'val'])
    n id  val
0  34  a    1
1  22  b    2

d.merge(keep, left_index=True, right_on=['id', 'val']).set_index(['n', 'id'])
       val
n  id     
34 a     1
22 b     2

甚至,

d.join(keep.set_index(['id', 'val']), how='inner')
         n
id val    
a  1    34
b  2    22

最新更新