You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:15:35