如何为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
相关产品推荐
相关产品推荐

