python - 有没有办法将熊猫应用的输出连接到单个多索引中?
问题描述
我有一个包含两列的数据框,其中两列中的每一列都包含一个列表索引。我想逐行获取两个列表的乘积以创建多索引。
比如下面的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。
任何帮助,将不胜感激!
解决方案
最简单的方法可能也是“最笨的”:只需取出每一行的产品,将它们放在一起,然后喂给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'])
推荐阅读
- php - Broken paths when running CouchCMS locally on macOS
- r - R:为循环中的多个向量创建降价报告
- html - 将电子表格中的所有数据转换为 html
- python-3.x - 如何在 wait_for_message() 函数中忽略来自客户端的消息?
- cordova - Ionic 3 应用内购买2 不显示产品
- c# - 结果表多保留单个数组怎么能
- python-3.x - Python3.6:OSError:[Errno 22] _io.BufferedReader.read(8) 的参数无效
- javascript - 如何将元素的背景图像设置为用户上传的图像
- bash - 替代多个 if-else-if 条件
- python - matplotlib 文本高度不同但宽度相同