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

如何为pandas DataFrame新增各分组月度请求量差值行

需求说明

原始数据源(csv格式)

Year;Month;website;status,XXX;Requests
2021;1;web.com;2XX;94557605
2021;1;web.com;3XX;18113
2021;1;web.com;4XX;412104
2021;1;web.com;5XX;1944
2021;2;web.com;2XX;65915413
2021;2;web.com;3XX;8176
2021;2;web.com;4XX;98080
2021;2;web.com;5XX;404
2021;3;web.com;2XX;73385551
2021;3;web.com;3XX;8204
2021;3;web.com;4XX;51097
2021;3;web.com;5XX;866
2021;4;web.com;2XX;19161899
2021;4;web.com;3XX;3113
2021;4;web.com;4XX;92152
2021;4;web.com;5XX;1110
2021;5;web.com;2XX;68930518
2021;5;web.com;3XX;3753
2021;5;web.com;4XX;80019
2021;5;web.com;5XX;69806
2021;1;api.com;2XX;94557605
2021;1;api.com;3XX;18113
2021;1;api.com;4XX;412104
2021;1;api.com;5XX;1944
2021;2;api.com;2XX;65915413
2021;2;api.com;3XX;8176
2021;2;api.com;4XX;98080
2021;2;api.com;5XX;404
2021;3;api.com;2XX;73385551
2021;3;api.com;3XX;8204
2021;3;api.com;4XX;51097
2021;3;api.com;5XX;866
2021;4;api.com;2XX;19161899
2021;4;api.com;3XX;3113
2021;4;api.com;4XX;92152
2021;4;api.com;5XX;1110
2021;5;api.com;2XX;68930518
2021;5;api.com;3XX;3753
2021;5;api.com;4XX;80019
2021;5;api.com;5XX;69806

目前已基于上述数据生成pandas透视表,效果如下:
透视表示例截图

目标要求

需要生成新的DataFrame,满足以下规则:

  • 对每一组「Year、Month、website、status.XXX」维度组合,新增一行存储当前维度Requests值与上月同维度数值的差值
    目标效果参考:
    目标效果截图

差值计算规则:上月(n-1月)数值减当月(n月)数值,例如web.com站点、状态码2XX分组下,2月对应差值为94557605 - 65915413(1月请求量减2月请求量)。

实现方案

核心逻辑是先按固定维度分组对齐上月数据,计算差值后将差值行与原数据合并排序即可,可直接参考以下代码:

import pandas as pd

# 读取原始csv数据,指定分隔符为分号
df = pd.read_csv("your_data.csv", sep=";")

# 按维度+月份排序,分组取上月请求量
df = df.sort_values(by=["Year", "website", "status,XXX", "Month"]).reset_index(drop=True)
df["last_month_req"] = df.groupby(["Year", "website", "status,XXX"])["Requests"].shift(1)

# 生成差值行:status字段标记为diff,和示例效果对齐,每年1月无上月数据自动跳过
diff_rows = df.dropna(subset=["last_month_req"]).copy()
diff_rows["status,XXX"] = "diff"
diff_rows["Requests"] = diff_rows["last_month_req"] - diff_rows["Requests"]
diff_rows = diff_rows.drop(columns=["last_month_req"])

# 合并原数据与差值行,排序后得到最终结果
final_df = pd.concat([df.drop(columns=["last_month_req"]), diff_rows], ignore_index=True)
final_df = final_df.sort_values(by=["Year", "Month", "website", "status,XXX"]).reset_index(drop=True)

如果需要调整差值行的标识、或者差值计算方向(比如当月减上月),直接修改对应字段的赋值逻辑即可。


内容的提问来源于stack exchange,提问作者C4K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:24:18