熊猫爆炸多列

Ims*_*msa 14 python dataframe pandas

我有多列的 DF。其中两列是相同 len 的列表。( col2 和 col3 是列表。列表的 len 是相同的)。

我的目标是在它自己的行上列出每个元素。

我可以使用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]
Run Code Online (Sandbox Code Playgroud)

结束数据帧

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          ...         ...
Run Code Online (Sandbox Code Playgroud)

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

yat*_*atu 9

您可以设置col1为索引并pd.Series.explode跨列应用:

df.set_index('col1').apply(pd.Series.explode).reset_index()
Run Code Online (Sandbox Code Playgroud)

或者:

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
Run Code Online (Sandbox Code Playgroud)

  • “ValueError:无法从重复轴重新索引”这是我运行以下命令时收到的错误。请指教。 (13认同)
  • 我有 Pandas 1.2.0,我得到了相同的“ValueError”。我实际上有一个 MultiIndex,但为了可重复性我尝试删除它,但它无论如何都不起作用。 (2认同)
  • 无需“set_index”和“reset_index”。只需使用`df = df.apply(pd.Series.explode)`。这将分解数据框中包含“列表”的所有列。 (2认同)
  • @MayankPorwal 我仍然得到 ValueError:无法从重复轴重新索引 (2认同)

Jas*_*oal 7

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

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

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

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