首页 > 解决方案 > 有没有办法将熊猫应用的输出连接到单个多索引中?

问题描述

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

比如下面的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 函数中完成,但之后在单独的步骤中执行它不会是世界末日。

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

任何帮助,将不胜感激!

标签: pythonpandasapplymulti-index

解决方案


最简单的方法可能也是“最笨的”:只需取出每一行的产品,将它们放在一起,然后喂给pd.MultiIndex.from_tuples.

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'])

推荐阅读