多索引查找给定值的所有索引

2024-04-19 01:34:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用pandas.SeriesMultiIndex进行双向加权查找。我认为使用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}

我很乐意指定级别号而不是级别名,并得到任何iterable,不一定是一个集合。我只有一个2级多指标,所以我不关心如何推广到更高级别的多指标,甚至不关心它是否推广。你知道吗

如果这涉及到迭代多索引中的所有条目并比较它们,我会有点不高兴,因为我认为索引有点像多键哈希表。你知道吗


Tags: 函数frompandasindexnames双向级别指标
2条回答

方法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:

插入{1}会得到一个对应于arg的整数,如果你想要插入一个位置,那么你可以使用:

演示:

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

因此,使用自定义函数而不是使用 给出了二级多索引DF的内建方法。你知道吗

这个怎么样:

>>> index.get_level_values('concept').values[index.get_level_values('word').values == 0]
array([0, 8, 9])

>>> index.get_level_values('concept').values[index.get_level_values('word').values == 6]
array([5])

>>> index.get_level_values('word').values[index.get_level_values('concept').values == 3]
array([4])

请注意,您可以轻松地将numpy数组转换为集合:

>>> set(np.array([1, 2, 3]))
{1, 2, 3}

将上述所有内容包装到某个函数other中应该不是很困难。你知道吗

相关问题 更多 >