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