请在下面找到我一直在研究的一个小而简单的 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 |
不是列表 | @ | 不是列表 |
不是列表 | $ | 不是列表 |
不是列表 | 不是列表 | 不是列表 |
我发现进行此类修改的最佳方法是某种递归。 不幸的是,我在相当长的一段时间里一直在为这种实现而苦苦挣扎。 我将非常感谢您的帮助和灵感。
假设实际列表如下:
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