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
相关产品推荐
相关产品推荐

