Pandas多列展开

21

我有一个拥有多个列的DF。其中两列是列表(col2和col3是列表,列表长度相同)。

我的目标是将每个元素单独列出来。

我可以使用 df.explode() 方法,但它只接受一列。然而,我想将这两列作为一对 "爆炸"。如果我使用 df.explode('col2') ,然后使用 df.explode('col3'),结果会生成9行而不是3行。

原始DF:

col0      col1        col2        col3
1       aa          [1,2,3]     [1.1,2.2,3.3]
2       bb          [4,5,6]     [4.4,5.5,6.6]
3       cc          [7,8,9]     [7.7,8.8,9.9]
3       cc          [7,8,9]     [7.7,8.8,9.9]

数据框结束

id      col1        col2        col3
1       aa          1           1.1
1       aa          2           2.2
1       aa          3           3.3
2       bb          4           4.4
2       bb          5           5.5
2       bb          6           6.6
3       cc          ...         ...

更新 没有任何一列拥有唯一值,因此不能用作索引。


更好的答案可以在这里找到。不需要使用set_indexreset_index - Mayank Porwal
2个回答

20
你可以将 col1 设置为索引,然后在列上应用 pd.Series.explode
df.set_index('col1').apply(pd.Series.explode).reset_index()

或者:

df.apply(pd.Series.explode)


   col1 col2 col3
0    aa    1  1.1
1    aa    2  2.2
2    aa    3  3.3
3    bb    4  4.4
4    bb    5  5.5
5    bb    6  6.6
6    cc    7  7.7
7    cc    8  8.8
8    cc    9  9.9
9    cc    7  7.7
10   cc    8  8.8
11   cc    9  9.9

15
价值错误:无法从重复的轴重新索引。这是我运行以下命令时遇到的错误。请建议。 - Imsa
2
我有Pandas 1.2.0版本,但是我仍然遇到了相同的“ValueError”错误。实际上,我使用了MultiIndex,但是为了可重现性,我尝试删除它,但无论如何都没有起作用。 - Adrian Guerra
2
不需要使用 set_indexreset_index。只需使用 df = df.apply(pd.Series.explode) 即可。这将展开数据框中所有包含 lists 的列。 - Mayank Porwal
2
@MayankPorwal 我仍然收到 ValueError: cannot reindex from a duplicate axis 的错误。 - G M
@MayankPorwal,请帮忙,我在使用Python库pandas,版本为1.2.4,py38h2531618_0。 - Rémy Hosseinkhan Boucher
显示剩余10条评论

7

我从其他答案中借鉴了这个解决方案(忘记在哪里了):

df.explode(['col2', 'col3'])

优点:比apply的解决方案更快。

确保col2和col3在同一行的单元格中具有相同数量的元素。


太棒了,正是我在寻找的。注意:需要 pandas >=1.3.0 - Maximosaic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接