如何以更简洁的Pandas方式固定次数复制DataFrame行?
Pandas批量复制行并添加月份列(替代循环实现)
需求回顾
现有带Year列的DataFrame,需要将同一年份的每行复制12次,再为复制后的行依次添加1-12的Months列。当前用for循环实现有效,但想换成更简洁的Pandas原生写法。
原循环代码
all_years = dataframe["Year"].unique().tolist() new_dataset = pd.DataFrame() for idx, year in enumerate(all_years): rows_dataframe = pd.concat( [dataframe.where(dataframe["Year"] == year).dropna()] * 12, ignore_index=True) new_dataset = pd.concat([rows_dataframe, new_dataset], ignore_index=True)
优化方案(两种Pandas风格写法)
方法1:用explode快速展开列表(最简洁)
先给每行添加一个包含1-12的月份列表,再通过explode将列表拆分为单独行,一步完成复制+月份赋值:
# 为每行添加包含1-12的月份列表 dataframe['Months'] = [list(range(1, 13))] * len(dataframe) # 展开列表为单独行,自动生成对应月份 new_dataset = dataframe.explode('Months', ignore_index=True) # 可选:将Months转换为整数类型 new_dataset['Months'] = new_dataset['Months'].astype(int)
方法2:用repeat+groupby.cumcount
先重复每行12次,再通过分组计数生成月份:
# 重复每行12次,重置索引 df_repeated = dataframe.loc[dataframe.index.repeat(12)].reset_index(drop=True) # 每12行一组(对应原始一行的12次复制),生成1-12的月份 df_repeated['Months'] = df_repeated.groupby(df_repeated.index // 12).cumcount() + 1
效果说明
两种方法都能实现:每个原始行生成12条记录,分别对应1到12月,完全替代原循环逻辑,且避免了循环拼接的性能损耗(数据量大时优势明显)。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

