从单元格中提取列表并将新行添加到 df

问题描述 投票:0回答:1

请在下面找到我一直在研究的一个小而简单的 df 示例。 我一直在努力从单元格中删除列表并相应地替换它们。

col1 col2 col3
[a,b] 不是列表 [1,2,3]
不是列表 [@,$] 不是列表
不是列表 不是列表 不是列表

列表可以随机放置在我的 df 中。对于一行,它们可能位于每列中,也可能不位于任何列中。 我需要从单元格中提取每个列表,将相关行相乘,使它们成为列表元素的组合。 这就是我想要得到的最终结果。

col1 col2 col3
a 不是列表 1
a 不是列表 2
a 不是列表 3
b 不是列表 1
b 不是列表 2
b 不是列表 3
不是列表 @ 不是列表
不是列表 $ 不是列表
不是列表 不是列表 不是列表

我发现进行此类修改的最佳方法是某种递归。 不幸的是,我在相当长的一段时间里一直在为这种实现而苦苦挣扎。 我将非常感谢您的帮助和灵感。

python pandas recursion
1个回答
0
投票

假设实际列表如下:

df = pd.DataFrame({'col1': [['a', 'b'], 'not a list', 'not a list'],
                   'col2': ['not a list', ['@', '$'], 'not a list'],
                   'col3': [[1,2,3], 'not a list', 'not a list']})

您可以依次

explode
所有列:

out = df.explode('col1').explode('col2').explode('col3')

或使用

functools.reduce
:

from functools import reduce

out = reduce(lambda x, c: x.explode(c), list(df), df)

输出:

         col1        col2        col3
0           a  not a list           1
0           a  not a list           2
0           a  not a list           3
0           b  not a list           1
0           b  not a list           2
0           b  not a list           3
1  not a list           @  not a list
1  not a list           $  not a list
2  not a list  not a list  not a list
© www.soinside.com 2019 - 2024. All rights reserved.