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

Pandas按多列分组后复制行并迭代设置年份的需求实现

解决Pandas生成多年份历史数据的问题

嗨,我来帮你搞定这个需求!结合你提到的三个操作,我整理了一套清晰的步骤,附代码示例和解释,你可以直接套用:

步骤拆解与代码实现

首先我们先模拟一份和你类似的原始数据,方便演示:

import pandas as pd
import numpy as np

# 模拟原始DataFrame(包含重复的Exchange+Ticker组合)
df = pd.DataFrame({
    'Exchange': ['NYSE', 'NASDAQ', 'NYSE'],
    'Ticker': ['AAPL', 'GOOGL', 'AAPL'],
    'Price': [150, 280, 152],
    'Volume': [1000000, 500000, 1050000]
})

1. 确保Exchange+Ticker组合唯一

先对重复的组合去重,保留每组的第一条记录(如果需要保留其他逻辑,可以调整keep参数,比如keep='last'或False删除所有重复项):

# 按指定列去重
df_unique = df.drop_duplicates(subset=['Exchange', 'Ticker'], keep='first')

2. 生成5条记录+3. 分配不同年份

这里提供两种简洁的实现方式,选你觉得顺手的就行:

方法一:用repeat + np.tile

# 定义需要的年份列表(可根据需求调整顺序或年份范围)
target_years = [2017, 2016, 2015, 2014, 2013]

# 每行重复5次
df_repeated = df_unique.loc[df_unique.index.repeat(5)].reset_index(drop=True)

# 循环分配年份(用tile确保每个Ticker对应完整的年份序列)
df_repeated['Year'] = np.tile(target_years, len(df_unique))

方法二:用assign + explode(更直观)

这种方法直接给每行绑定一个年份列表,再展开成多行,代码可读性更高:

target_years = [2017, 2016, 2015, 2014, 2013]

# 给每行添加年份列表,再展开成单独行
df_final = df_unique.assign(Year=[target_years]*len(df_unique)).explode('Year').reset_index(drop=True)

验证结果

运行完上面的代码后,你可以用df_final.groupby(['Exchange', 'Ticker'])['Year'].nunique()来验证每个Ticker是否都有5个不同的年份,确保符合需求。

如果你的原始数据还有其他需要保留的列,这两种方法都会自动保留所有列,只新增Year列,完全适配你的场景~

内容的提问来源于stack exchange,提问作者user3709511

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:34:59