【发布时间】:2021-08-13 15:03:11
【问题描述】:
可重现的例子:
ex = [{"explode1": ["a", "e", "i"], "word": "US_12", "explode2": []},
{"explode1": [], "word": "US_34", "explode2": ["a", "e", "i"]},
{"explode1": ["a", "e", "i"], "word": "US_56", "explode2": ["o", "u"]}]
df = pd.DataFrame(ex)
给你
explode1 word explode2
0 [a, e, i] US_12 []
1 [] US_34 [a, e, i]
2 [a, e, i] US_56 [o, u]
您可以假设还有一个 explode3 和一个 explode4 列(为简洁起见排除)
预期结果数据框:
exploded_alphabet word exploded_type
0 a US_12 explode1
1 e US_12 explode1
2 i US_12 explode1
3 a US_34 explode2
4 e US_34 explode2
5 i US_34 explode2
6 a US_54 explode1
7 e US_54 explode1
8 i US_54 explode1
9 o US_34 explode2
10 u US_34 explode2
解决方案必须是可重现的 4 列,而不仅仅是上面提到的 2 列(为了简洁起见,我没有在我的示例中包含 explode3 和 explode4)
因此总行数将等于 explode1、explode2、explode3 和 explode4 扁平化的所有列表中的元素数。
我的努力:
老实说,我认为必须有一种更短的 Pythonic 方式,而不是单独分解每一个,然后分解具有多种类型的那些。
df = df.explode("explode1")
df = df.explode("explode2")
以上内容不正确。因为这不会同时爆炸行。如果列表在多个爆炸列中不为空,则会创建重复项。
另一种是非pythonic方式,您可以逐行迭代并创建和分配一个新列——这很长而且很容易做到。但这个问题可能已经以不同的方式解决了。
我的问题与其他“分解多列”问题有何不同?:
-
分别爆炸。这些列中的每个元素都会创建一个新行(这可能已经存在于 SO)
-
在
exploded_type中分配值 - 不确定这是否已在 SO 上与 1 一起解决。
【问题讨论】:
标签: python python-3.x pandas dataframe numpy