求Python函数:对DataFrame分组按周期逻辑计算Difference列
实现DataFrame的Difference列计算
核心逻辑实现步骤
- 从
Closing_time字段提取周期标识(如D-0、D+1) - 按
Cost_centre、Account、Year、Month分组,计算每个周期内最大Closing_time对应的Amount - 对周期排序,匹配每个周期的前置周期最大值
- 合并数据并计算每行的
Difference
代码实现
假设你的数据集存储在名为df的Pandas DataFrame中,执行以下代码:
import pandas as pd # 1. 从Closing_time提取周期标识(适配类似"2023-10-01 D-0 18 CST"的格式) df['Period'] = df['Closing_time'].str.extract(r'(D[+-]\d+)') # 2. 将周期转换为可排序的数值,确保周期顺序正确(如D-0 < D+1 < D+3) def period_to_numeric(period): if '-' in period: sign = -1 num = int(period.split('-')[-1]) else: sign = 1 num = int(period.split('+')[-1]) return sign * num df['Period_num'] = df['Period'].apply(period_to_numeric) # 3. 转换Closing_time为datetime类型(若原始数据是字符串) df['Closing_time'] = pd.to_datetime(df['Closing_time'], format='%Y-%m-%d %H %Z') # 4. 分组计算每个周期的最大Amount(取该周期内Closing_time最大的行对应的Amount) period_max_df = df.groupby(['Cost_centre', 'Account', 'Year', 'Month', 'Period']).apply( lambda group: group.loc[group['Closing_time'].idxmax(), 'Amount'] ).reset_index(name='Period_Max') # 5. 为每个组内的周期排序,并匹配前置周期的最大值 period_max_df['Period_num'] = period_max_df['Period'].apply(period_to_numeric) period_max_df = period_max_df.sort_values( by=['Cost_centre', 'Account', 'Year', 'Month', 'Period_num'] ) period_max_df['Prev_Period_Max'] = period_max_df.groupby( ['Cost_centre', 'Account', 'Year', 'Month'] )['Period_Max'].shift(1) # 6. 合并回原DataFrame,计算Difference列 df = df.merge( period_max_df[['Cost_centre', 'Account', 'Year', 'Month', 'Period', 'Prev_Period_Max']], on=['Cost_centre', 'Account', 'Year', 'Month', 'Period'], how='left' ) df['Difference'] = df['Amount'] - df['Prev_Period_Max'] # 可选:清理临时生成的辅助列 df.drop(columns=['Period_num', 'Prev_Period_Max'], inplace=True)
关键说明
- 周期提取:通过正则表达式
r'(D[+-]\d+)'精准匹配周期标识,若你的Closing_time格式不同,可调整正则表达式 - 周期排序:将周期转为数值(如D-0→0,D+1→1),确保分组内周期按业务逻辑排序
- 前置周期匹配:用
shift(1)在分组内获取前一个周期的最大值,无前置周期的行自动得到NaN,计算后Difference即为NaN,符合需求
内容的提问来源于stack exchange,提问作者rajank24
相关产品推荐
相关产品推荐

