如何按指定次数重复DataFrame行并正确拼接结果?
问题描述
现有两个数据结构:
- DataFrame
A:
A = pd.DataFrame([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
- 列表
B:[1,2,3]
需要生成DataFrame C,其中A的每一行按照B中对应位置的次数重复,最终结果如下:
C = pd.DataFrame([[1,2,3,4], [5,6,7,8], [5,6,7,8], [9,10,11,12], [9,10,11,12], [9,10,11,12]])
原尝试的代码存在问题:
- 单循环赋值仅保留最后一次结果:
for i in range(0,2401): g = pd.concat([df1.iloc[[i]]]*z[i], ignore_index=True)
- 用列表收集后拼接的方法可行,但不够简洁且索引易混乱:
result = [] for i in range(0,2401): g = pd.concat([df1.iloc[[i]]]*z[i], ignore_index=True) result.append(g)
寻求更规范简洁的实现方式。
简洁实现方法
方法1:利用numpy.repeat生成重复索引
这是效率最高的方案之一,通过生成重复的行索引直接提取目标行:
import pandas as pd import numpy as np # 构造示例数据 A = pd.DataFrame([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) B = [1,2,3] # 生成每行重复对应次数的索引 repeated_indices = np.repeat(A.index, B) # 提取行并重置索引 C = A.iloc[repeated_indices].reset_index(drop=True)
方法2:优化循环拼接逻辑
如果偏好循环思路,可直接在循环中完成拼接,避免额外列表存储:
import pandas as pd A = pd.DataFrame([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) B = [1,2,3] C = pd.DataFrame() for i in range(len(A)): # 直接拼接当前行的重复结果到目标DataFrame C = pd.concat([C, pd.concat([A.iloc[[i]]]*B[i], ignore_index=True)], ignore_index=True)
注:此方法效率低于方法1,适合小数据量场景。
内容的提问来源于stack exchange,提问作者S.Turk
相关产品推荐
相关产品推荐

