如何复制DataFrame行并逐日递增指定日期列的值
解决Pandas按行生成日期递增重复行的需求
直接上可行的实现方案,分两种方式,优先推荐第一种更简洁高效的:
方法一:用explode实现(推荐)
先导入依赖库:
import pandas as pd from pandas.tseries.offsets import DateOffset
假设你的原始DataFrame已经存在,先给个示例构造(如果你的数据是现成的,跳过这步):
# 构造4列12行的示例DataFrame data = { 'date': pd.date_range(start='2023-01-01', periods=12, freq='MS'), 'col1': [f'item_{i}' for i in range(12)], 'col2': range(1,13), 'col3': [i*10 for i in range(12)] } df = pd.DataFrame(data)
核心实现代码:
# 为每行生成指定范围的日期序列,存入新列 df['date_series'] = df['date'].apply( lambda x: pd.date_range(start=x, end=x + DateOffset(months=1), freq='d') ) # 展开日期序列列,同时保留其他列的重复值,最后替换原date列 result_df = df.explode('date_series').drop(columns='date').rename(columns={'date_series': 'date'}) # 可选:重置索引 result_df = result_df.reset_index(drop=True)
原理很简单:
- 用
apply给每行的date生成你要的月度日期序列,存成列表格式的列 explode会把列表里的每个日期拆成单独一行,其他列自动重复对应行的值- 最后删掉原date列,把新的日期列重命名回去就行
方法二:循环拼接(兼容旧思路)
如果习惯用循环处理每行,也可以这么写:
result_list = [] # 遍历原始DataFrame的每一行 for idx, row in df.iterrows(): # 生成当前行对应的日期范围 date_seq = pd.date_range(start=row['date'], end=row['date'] + DateOffset(months=1), freq='d') # 复制当前行len(date_seq)次,生成临时DataFrame temp_df = pd.DataFrame([row]*len(date_seq)) # 替换临时DataFrame的date列为生成的日期序列 temp_df['date'] = date_seq # 加入结果列表 result_list.append(temp_df) # 合并所有临时DataFrame result_df = pd.concat(result_list, ignore_index=True)
两种方法都能实现需求,第一种explode的写法更简洁,执行效率也更高,适合你这种12行的小数据量场景。
内容的提问来源于stack exchange,提问作者Floralys
相关产品推荐
相关产品推荐

