You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以更简洁的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:25:25