如何在Pandas DataFrame中复制行并逐日递增date列
实现方法
核心思路
利用pandas的apply生成每行对应的日期序列列表,再通过explode将列表拆分为多行,自动保留其他列的重复值,无需手动循环拼接。
代码实现
1. 导入依赖库
import pandas as pd from pandas.tseries.offsets import DateOffset
2. 准备原始数据(替换为你的真实DataFrame)
# 模拟12行的示例数据 data = { 'date': pd.date_range('2023-01-01', periods=12, freq='M'), 'Video_ID': [f'vid_{i}' for i in range(12)], 'ratio_liked': [0.8 + i*0.01 for i in range(12)], 'accomulated_views': [1000 + i*500 for i in range(12)] } df = pd.DataFrame(data)
3. 生成展开后的DataFrame
# 定义生成日期序列的函数 def generate_dates(row): start_date = row['date'] end_date = start_date + DateOffset(months=1) # 生成从start_date到end_date前一天的逐日日期(确保仅包含当月约30天数据) return pd.date_range(start_date, end_date - pd.Timedelta(days=1), freq='d').tolist() # 替换date列为日期列表,再拆分为多行 df_expanded = df.assign(date=df.apply(generate_dates, axis=1)).explode('date', ignore_index=True)
4. 验证结果
查看某一视频的展开数据:
print(df_expanded[df_expanded['Video_ID'] == 'vid_0'])
关键点说明
apply(..., axis=1):逐行处理原始数据,为每行生成对应月份的逐日日期列表explode('date'):将列表格式的date列拆分为独立行,其他列的数值自动重复匹配- 日期边界处理:通过
end_date - pd.Timedelta(days=1)避免包含下月初的日期,保证每行生成约30条数据
内容的提问来源于stack exchange,提问作者Floralys
相关产品推荐
相关产品推荐

