MultiIndex 和列表之间的产品

Product between MultiIndex and a list

提问人:endive1783 提问时间:11/17/2023 最后编辑:endive1783 更新时间:11/18/2023 访问量:55

问:

我有一个具有 2 个级别的 MultiIndex 对象:

import pandas as pd
mux = pd.MultiIndex.from_tuples([(1,1), (2,3)])
>>>
MultiIndex([(1, 1),
            (2, 3)],
           )

我想把它乘以一个列表,我试过了l=[4,5]

pd.MultiIndex.from_product([mux.values, [4,5]])
>>>
MultiIndex([((1, 1), 4),
            ((1, 1), 5),
            ((2, 3), 4),
            ((2, 3), 5)],
           )

我设法得到了我预期的结果

from itertools import product
pd.MultiIndex.from_tuples([(*a, b) for a, b in product(mux, [4,5])])
>>>
MultiIndex([(1, 1, 4),
            (1, 1, 5),
            (2, 3, 4),
            (2, 3, 5)],
           )

有没有更好的方法来执行此操作?

python pandas 多索引 笛卡尔积

评论


答:

3赞 mozway 11/17/2023 #1

我认为你的方法很合理。

使用中间 DataFrame 格式交叉合并的另一个选项:

pd.MultiIndex.from_frame(mux.to_frame().merge(pd.Series([4, 5], name=2), how='cross'))

输出:

MultiIndex([(1, 1, 4),
            (1, 1, 5),
            (2, 3, 4),
            (2, 3, 5)],
           names=[0, 1, 2])
1赞 Yogesh 11/17/2023 #2

您可以尝试以下操作:

import pandas as pd

mux = pd.MultiIndex.from_tuples([(1, 1), (2, 3)])
l = [4, 5]

# Create the MultiIndex by broadcasting the lists
result = pd.MultiIndex.from_arrays([mux.get_level_values(0), mux.get_level_values(1), l * len(mux)])

print(result)
`

评论

0赞 endive1783 11/17/2023
ValueError:所有数组的长度必须相同
1赞 sammywemmy 11/18/2023 #3

一种可能更有效的方法是在数组级别进行组合,在构建新的 MultiIndex 之前使用 和 进行组合。这样,您就可以处理数组,而不是仅为了返回索引而构建 DataFrame。与往常一样,使用您的实际数据进行测试:np.repeatnp.tile

len_mux = len(mux)
len_l = len(l)
mux = mux.repeat(len_l)
mux = [mux.get_level_values(n) for n in range(mux.nlevels)]
l = np.tile(l, len_mux)
mux.append(l)
pd.MultiIndex.from_arrays(mux)
MultiIndex([(1, 1, 4),
            (1, 1, 5),
            (2, 3, 4),
            (2, 3, 5)],
           )