如何在iterrows中重复DataFrame行n次并生成目标新DataFrame
问题:将DataFrame每行重复n次生成新DataFrame
需求
遍历DataFrame的每一行,将每行重复n次后生成新的DataFrame。
当前实现代码
df = pd.DataFrame( [ ("abcd", "abcd", "abcd") # create your data here, be consistent in the types. ], ["A", "B", "C"] # add your column names here ) n_times = 2 for index, row in df.iterrows(): new_df = row.loc[row.index.repeat(n_times)] new_df
当前输出
0 abcd 0 abcd 1 abcd 1 abcd 2 abcd 2 abcd Name: C, dtype: object
期望输出
A B C 0 abcd abcd abcd 1 abcd abcd abcd
解决方案
问题分析
原来的代码有两个核心问题:
- 循环中每次迭代都会覆盖
new_df变量,最终只保留了最后一行的处理结果; - 对行对象(Series类型)执行重复操作后,得到的是一维Series,完全破坏了原DataFrame的列结构,导致输出不符合预期;
- 额外注意:原代码构造DataFrame时参数写反了,
["A","B","C"]被当成了行索引,列名应该用columns参数指定,这是隐藏的基础错误。
方法1:高效的向量式操作(推荐)
直接利用pandas的索引重复功能,不需要循环,性能更优:
import pandas as pd # 纠正DataFrame构造的参数错误,用columns指定列名 df = pd.DataFrame( [("abcd", "abcd", "abcd")], columns=["A", "B", "C"] ) n_times = 2 # 重复原DataFrame的行索引,重新生成DataFrame后重置索引 new_df = df.loc[df.index.repeat(n_times)].reset_index(drop=True) print(new_df)
输出结果:
A B C 0 abcd abcd abcd 1 abcd abcd abcd
方法2:循环实现(不推荐,适合小数据量)
如果一定要用循环处理每行,需要把每次重复后的行保存到列表,最后合并成DataFrame:
import pandas as pd df = pd.DataFrame( [("abcd", "abcd", "abcd")], columns=["A", "B", "C"] ) n_times = 2 temp_rows = [] for _, row in df.iterrows(): # 将单行转为DataFrame并重复n次,添加到临时列表 temp_rows.append(pd.DataFrame([row] * n_times, columns=df.columns)) # 合并所有临时DataFrame,重置索引 new_df = pd.concat(temp_rows, ignore_index=True) print(new_df)
内容的提问来源于stack exchange,提问作者saul santos
相关产品推荐
相关产品推荐

