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

标签 python pandas indexing multi-index

我正在使用带有 MultiIndexpandas.Series 进行双向加权查找。我认为使用 MultiIndex 也应该很容易找到给定级别的相应其他级别,但我找不到一个简单的函数 other 来执行如下操作:

>>> 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 中的所有条目并比较它们,我会有点不高兴,因为我认为索引有点像多键哈希表。

最佳答案

方法一:

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

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:

如果您想使用一种内置方法,只需将值插入相应的参数即可获得结果,您可以选择 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 的内置方法。

关于python - MultiIndex 查找给定级别具有给定值的所有索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39912657/

相关文章:

python - max 在 min 之前最后一次出现的索引

python - 从 pandas 数据帧中分离并创建字典

c++ - 在 C++ 中使用另一个变量来限制数组索引

python - dbf 到 xls - 第一个非标题行未写入

java - 将变量从java传递给python脚本

python - 在 Pandas 中读取、选择和重新排列列

python - 在 Python Pandas 中删除多列中的所有重复行

sql-server - 正确索引 UNPIVOT SQL 查询

python - python图像上的滑动窗口

python - 如何将 for 循环转换为递归方法?