首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:切片多指标多指标

熊猫:切片多指标多指标
EN

Stack Overflow用户
提问于 2019-06-13 14:38:38
回答 3查看 121关注 0票数 4

我有一个dataframe d,其中包含100,000,000行和3列。看起来是这样的:

代码语言:javascript
复制
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中保留它们。我想保留大约60万个idval的组合:

代码语言:javascript
复制
In [20]: keep = pd.DataFrame({'id':['a', 'b'], 'val' : [1, 2]})

我尝试了以下几种方法:

代码语言:javascript
复制
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

这是可行的,但似乎笨重,而且非常缓慢。这里有更好的方法吗?在熊猫的多索引切片上,最快的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-13 14:48:43

使用reindex

代码语言:javascript
复制
d.reindex(pd.MultiIndex.from_frame(keep))
Out[151]: 
         n
id val    
a  1    34
b  2    22
票数 5
EN

Stack Overflow用户

发布于 2019-06-13 14:42:14

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

代码语言:javascript
复制
d.loc[[*keep.itertuples(index=False)]]

         n
id val    
a  1    34
b  2    22

一种更讨厌的方式来做同样的事情。(实际上不是一项建议)

代码语言:javascript
复制
d.loc[[*zip(*map(keep.get, keep))]]

         n
id val    
a  1    34
b  2    22

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

票数 5
EN

Stack Overflow用户

发布于 2019-06-13 14:40:57

使用locd进行keep索引

代码语言:javascript
复制
# 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

哪里,

代码语言:javascript
复制
pd.MultiIndex.from_arrays([keep['id'], keep['val']])

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

从用于筛选的MultiIndex中生成keep

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

代码语言:javascript
复制
d.merge(keep, left_index=True, right_on=['id', 'val'])

    n id  val
0  34  a    1
1  22  b    2

代码语言:javascript
复制
d.merge(keep, left_index=True, right_on=['id', 'val']).set_index(['n', 'id'])

       val
n  id     
34 a     1
22 b     2

甚至,

代码语言:javascript
复制
d.join(keep.set_index(['id', 'val']), how='inner')

         n
id val    
a  1    34
b  2    22
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56582957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档