Python 有没有办法将应用程序的输出连接到单个多索引中?

Python 有没有办法将应用程序的输出连接到单个多索引中?,python,pandas,apply,multi-index,Python,Pandas,Apply,Multi Index,我有一个包含两列的数据框架,其中两列中的每一列都包含一个列表索引。我想逐行获取两个列表的乘积,以创建一个多索引 例如,下面的df1 |---------------------|------------------| | col_a | col_b | |---------------------|------------------| | [A1, A2] | [B1] | |-----------

我有一个包含两列的数据框架,其中两列中的每一列都包含一个列表索引。我想逐行获取两个列表的乘积,以创建一个多索引

例如,下面的df1

|---------------------|------------------|
|        col_a        |        col_b     |
|---------------------|------------------|
|       [A1, A2]      |        [B1]      |
|---------------------|------------------|
|          [A3]       |      [B2, B3]    |
|---------------------|------------------|

将变成这样:

MultiIndex([('A1', 'B1'),
            ('A2', 'B1'),
            ('A3', 'B2'),
            ('A3', 'B3')],
names = ['col_a', 'col_b'], length = 4)

我现在正在做的是:

my_multiindex = df1.apply(lambda row: pd.MultiIndex.from_product([row["col_a"], row["col_b"]], names = ['col_a', 'col_b']), axis = 1)
但是,这是的输出如下所示:

0     MultiIndex([('A1', 'B1'), ('A2', 'B1')])
1     MultiIndex([('A3', 'B2'), ('A3', 'B3')])
每行一个对象,这很有意义,因为我们在轴1上使用应用程序

是否有任何方法可以将所有输出对象“连接”到单个多索引中?最好可以在lambda函数中完成,但在单独的步骤中完成之后不会是世界末日

如果您对如何完成整个任务(不仅仅是我描述的具体“连接”步骤)有任何建议,那也会很有帮助。我已经尝试过使用iterrows在for循环中执行此操作,但这太长了,因为df1的大小约为50K行,a列中列表的平均长度为300,b列中列表的平均长度为30


任何帮助都将不胜感激

可以从简单的
itertools
版本的
产品开始。使用
product(*row)
生成笛卡尔积(如果有两列以上,也可以使用)。然后是
sum()
多索引。从元组中:

pd.MultiIndex.from_tuples(df.apply(lambda r: list(product(*r)), axis=1).sum())

最简单的方法可能也是“最愚蠢的”:只需获取每行的产品,将它们全部放在一起,然后将它们从元组中馈送到
pd.MultiIndex.from

import itertools
rowwise_products = df.apply(
    lambda row: list(itertools.product(*row)),
    axis=1
)
all_tuples = rowwise_products.sum()  # list concatenation

>>> pd.MultiIndex.from_tuples(all_tuples, names=df.columns)
MultiIndex([('A1', 'B1'),
            ('A2', 'B1'),
            ('A3', 'B1'),
            ('A3', 'B2'),
            ('A3', 'B3')],
           names=['col_a', 'col_b'])

哈哈:看来我们的答案是异花授粉的,基本上是一样的!感谢您使用
.sum()
将所有列表放在一起。谢谢!这帮我完成了任务。我没有想到要使用.sum()。非常聪明的你和皮埃尔D想到这一点。这也很有效,谢谢你的张贴!