如何删除DataFrame explode后每组的最后一行?
问题解决:移除DataFrame explode后每组的最后一行
问题背景
原始DataFrame结构:
A B C 0 [a, b, c] 1 22 1 [d, e] 2 45 2 [f, g] 3 32 3 [h, i] 4 64 4 [j, k, l, m] 5 76
使用df.explode('A')展开后得到:
A B C 0 a 1 22 0 b 1 22 0 c 1 22 1 d 2 45 1 e 2 45 2 f 3 32 2 g 3 32 3 h 4 64 3 i 4 64 4 j 5 76 4 k 5 76 4 l 5 76 4 m 5 76
需要删除每组(同索引行)的最后一行,即移除c、e、g、i、m对应的行,且数据量庞大无法手动操作。
可行解决方案
方法1:展开后分组过滤
如果已经完成explode操作,可通过分组计数定位每组最后一行并过滤:
# 先保存展开后的结果 df_exploded = df.explode('A') # 按原索引分组,计算组内行号,排除最后一行 df_result = df_exploded[ df_exploded.groupby(level=0).cumcount() < df_exploded.groupby(level=0).transform('size') - 1 ]
原理:cumcount()给每组内的行从0开始编号,transform('size')获取每组的总行数,编号小于总行数-1的行即为除最后一行外的所有行。
方法2:展开前预处理列表(推荐大数据量场景)
直接在explode前去掉每个列表的最后元素,避免生成大量冗余行后再过滤,内存和性能更优:
# 对A列的每个列表切片,移除最后一个元素 df['A'] = df['A'].apply(lambda x: x[:-1]) # 执行explode得到目标结果 df_result = df.explode('A')
这种方法减少了中间数据量,尤其适合百万级以上的大型DataFrame。
内容的提问来源于stack exchange,提问作者Koen van Maanen
相关产品推荐
相关产品推荐

