ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – MultiIndex查找具有给定级别给定值的所有索引

2019-08-28 21:09:20  阅读:253  来源: 互联网

标签:multi-index python pandas indexing


我正在使用带有MultiIndex的pandas.Series进行双向加权查找.我认为使用MultiIndex找到给定级别的相应其他级别应该很容易,但我找不到其他类似以下内容的简单函数:

>>> index=pandas.MultiIndex.from_tuples(
...                  [(0, 0),(1,2),(3,4),(5,6),(5,7),(8,0),(9,0)],
...                  names=["concept", "word"])
>>> other(index, "word", 0)
{0, 8, 9}
>>> other(index, "concept", 3)
{4}
>>> other(index, "word", 6)
{5}

我很乐意指定级别编号而不是级别名称,并获得任何可迭代的,不一定是集合.我只有一个2级多指数,所以我不关心如何推广到更高级别的多指数,或者甚至是否进行推广.

如果这涉及迭代MultiIndex中的所有条目并进行比较,我会有点不高兴,因为我认为索引有点像多键哈希表.

解决方法:

方法1:

您可以使用矢量化方法构建自定义函数,如下所示:

def other(index, slicing, value):
    arr = np.column_stack(index.values.tolist())
    return (np.delete(arr, slicing, axis=0)[0][arr[slicing]==value])

用法:

other(index, slicing=index.names.index('word'), value=0)
# array([0, 8, 9])

时序:

%timeit other(index, slicing=index.names.index('word'), value=0)
10000 loops, best of 3: 43.9 µs per loop

方法2:

如果你想使用一个内置的方法,只需将值插入相应的args就可以得到结果,你可以选择get_loc_level,它会给你一个与标签对应的整数位置切片,如下所示:

演示:

index.get_loc_level(key=3, level='concept')[1].ravel()
# array([4], dtype=int64)

index.get_loc_level(key=0, level='word')[1].ravel()
# array([0, 8, 9], dtype=int64)

index.get_loc_level(key=6, level='word')[1].ravel()
# array([5], dtype=int64)

时序:

%timeit index.get_loc_level(key=0, level='word')[1].ravel()
10000 loops, best of 3: 129 µs per loop

因此,使用自定义函数而不是实现使用,可以获得3倍的提升
给出了2级多索引DF的内置方法.

标签:multi-index,python,pandas,indexing
来源: https://codeday.me/bug/20190828/1755788.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有