如何高效将多周期Pandas DataFrame转换为单月度周期?
高效拆分多周期收入为月度数据的Pandas方案
针对你的需求——将跨多个月的周期收入拆分为单月度均分数据,替代低效的逐行循环方案,这里提供两种基于Pandas内置函数的高效实现:
方法一:生成日期序列后Explode(易读性优先)
这种方法逻辑直观,通过为每行生成对应周期内的月度结束日期列表,再用explode展开,适合中小数据集:
import pandas as pd # 确保日期列转为datetime类型 df['date'] = pd.to_datetime(df['date']) df['date_to'] = pd.to_datetime(df['date_to']) # 计算月度均分收入 df['monthly_revenue'] = df['net_revenues'] / df['date_diff'] # 为每行生成周期内的所有月末日期列表 df['month_dates'] = df.apply( lambda row: pd.date_range(start=row['date'], end=row['date_to'], freq='M').date, axis=1 ) # 展开日期列表并整理结果列 new_df = df.explode('month_dates')[['monthly_revenue', 'month_dates']].rename( columns={ 'monthly_revenue': 'new_net_revenues', 'month_dates': 'new_date' } )
方法二:全向量化操作(性能优先)
完全避免逐行apply,利用repeat和分组计数实现纯向量化计算,速度最快,适合大规模数据集:
import pandas as pd # 确保日期列转为datetime类型 df['date'] = pd.to_datetime(df['date']) df['date_to'] = pd.to_datetime(df['date_to']) # 计算月度均分收入 df['monthly_revenue'] = df['net_revenues'] / df['date_diff'] # 按周期月数重复每行数据 repeated_df = df.loc[df.index.repeat(df['date_diff'])] # 为每组重复行生成月份偏移量(0到date_diff-1) repeated_df['month_offset'] = repeated_df.groupby(repeated_df.index).cumcount() # 计算对应月度的结束日期 repeated_df['new_date'] = ( repeated_df['date'] + pd.offsets.MonthBegin(repeated_df['month_offset']) + pd.offsets.MonthEnd() ) # 整理最终结果 new_df = repeated_df[['monthly_revenue', 'new_date']].rename( columns={'monthly_revenue': 'new_net_revenues'} )
方案优势
两种方法均利用Pandas的C级优化内置操作,相比原有的iterrows嵌套循环,性能提升数十倍甚至上百倍:
- 避免了Python层面的循环开销,完全依托Pandas的向量化计算能力
- 代码更简洁易维护,无需手动管理行的复制和添加
内容的提问来源于stack exchange,提问作者nilsfl
相关产品推荐
相关产品推荐

