熊猫如何为每个新行爆炸几个列表项

Posted

技术标签:

【中文标题】熊猫如何为每个新行爆炸几个列表项【英文标题】:Pandas how to explode several items of list for each new row 【发布时间】:2021-09-04 06:02:30 【问题描述】:

我有一个数据框:

c1.  c2.  c3.  l
1.   2.   3    [1,2,3,4,5,6,7]
3.   4.   8.   [8,9,0]

我想将它分解,使得 l 列中每个列表中的每 3 个元素将成为一个新行,并且原始列表中的三元组索引的列。所以我会得到:

c1.  c2.  c3.  l          idx
1.   2.   3    [1,2,3].    0
1.   2.   3.   [4,5,6].    1
3.   4.   8.   [8,9,0].    0

最好的方法是什么?

【问题讨论】:

l第一行的7怎么了? @MustafaAydın 我只取到最后一个除以 3(去掉残差) 【参考方案1】:

先将列表元素分成块,然后explode

df.l = df.l.apply(lambda lst: [lst[3*i:3*(i+1)] for i in range(len(lst) // 3)])

df    
#   c1  c2  c3                       l
#0   1   2   3  [[1, 2, 3], [4, 5, 6]]
#1   3   4   8             [[8, 9, 0]]

df.explode('l')
#   c1  c2  c3          l
#0   1   2   3  [1, 2, 3]
#0   1   2   3  [4, 5, 6]
#1   3   4   8  [8, 9, 0]

如果需要索引列:

# store index as second element of the tuple
df.l = df.l.apply(lambda lst: [(lst[3*i:3*(i+1)], i) for i in range(len(lst) // 3)])

df    
#   c1  c2  c3                                 l
#0   1   2   3  [([1, 2, 3], 0), ([4, 5, 6], 1)]
#1   3   4   8                  [([8, 9, 0], 0)]

df = df.explode('l')
df
#   c1  c2  c3               l
#0   1   2   3  ([1, 2, 3], 0)
#0   1   2   3  ([4, 5, 6], 1)
#1   3   4   8  ([8, 9, 0], 0)

# extract list and index from the tuple column
df['l'], df['idx'] = df.l.str[0], df.l.str[1]
df
#   c1  c2  c3          l  idx
#0   1   2   3  [1, 2, 3]    0
#0   1   2   3  [4, 5, 6]    1
#1   3   4   8  [8, 9, 0]    0

【讨论】:

请注意它们不应该重叠(第二行应该是 [4,5,6] 谢谢,你能看看我最后的编辑(添加 idx col)吗? 是否可以添加步长为 2?那么l中的值之间会有重叠吗?

以上是关于熊猫如何为每个新行爆炸几个列表项的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个给定的外键列表获取 n 项?

如何为 SELECT 查询的每个结果插入三个新行到同一个表中

如何为各种列表视图项打开不同的 XML?

你如何为每个父项存储子 NSTableView 设置?

如何为列表中的每个项目添加一个布尔值?

如何为所有列表项设置图像