PySpark教程:如何将DataFrame中的行重复n次?
实现DataFrame按指定列值重复行的方法
你说得没错,explode()确实可以用来实现这个需求,不过需要先做个小转换才能让它发挥作用。另外还有一种更直接高效的方法,我都给你详细讲讲:
方法一:使用explode()函数
explode()的核心作用是把包含可迭代对象(比如列表、元组)的列拆分成多行,所以我们可以先给每行生成一个长度等于n的列表,再通过explode()完成拆分:
首先先构造你的示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'A': [1, 2, 3, 4, 5], 'B': [2, 9, 8, 1, 3], 'n': [1, 1, 2, 1, 3] })
然后执行以下步骤实现行重复:
# 添加临时列,每行生成一个长度等于n的列表(元素内容不影响,只要长度匹配就行) df['temp_list'] = df['n'].apply(lambda x: [x] * x) # 对临时列执行explode,把列表拆分成多行 result = df.explode('temp_list') # 删除临时列,得到最终结果 result = result.drop('temp_list', axis=1)
你也可以把这些步骤合并成链式操作,代码更简洁:
result = df.assign(temp_list=lambda x: x['n'].apply(lambda y: [y]*y)) \ .explode('temp_list') \ .drop('temp_list', axis=1)
方法二:使用index.repeat()(更高效直接)
这种方法不需要额外构造临时列,直接通过重复行索引来实现行重复,代码更简洁高效:
result = df.loc[df.index.repeat(df['n'])]
验证结果
两种方法运行后,得到的结果都和你期望的完全一致:
A B n 0 1 2 1 1 2 9 1 2 3 8 2 2 3 8 2 3 4 1 1 4 5 3 3 4 5 3 3 4 5 3 3
如果你的DataFrame数据量较大,index.repeat()的执行效率会更高;如果更习惯explode()的思路,第一种方法也完全可以满足需求~
内容的提问来源于stack exchange,提问作者Chjul
相关产品推荐
相关产品推荐

