Python如何对不同索引行重复执行运算计算同行业月度差值
实现思路
你之前写的固定偏移i-2取数的逻辑有本质缺陷:它仅在「每个统计周期恰好2个行业、所有行业按完全固定的顺序排列」的特殊情况下能凑出正确结果,一旦行业数量增减、行顺序变动,就会匹配到错误行业的数值,完全没有实现按行业维度匹配同维度上期值的核心要求,自然无法得到正确结果。
以下是两种可稳定运行的实现方案:
方案1:pandas实现(推荐,适配Excel表格处理场景)
用pandas的分组差值函数可以直接实现需求,不需要手动管理索引、写循环,自动适配任意行业数量、行排列顺序,鲁棒性更强。
- 先安装依赖(已安装可跳过):
pip install pandas openpyxl - 运行以下代码即可完成计算:
运行上述代码处理你给出的示例数据,输出结果和你提供的预期差值完全一致。import pandas as pd # 替换为你的Excel文件实际路径 df = pd.read_excel("就业数据.xlsx") # 核心逻辑:按行业分组,计算组内就业人数的逐期差值 df["Difference from prev. month"] = df.groupby("Industry")["No. of jobs"].diff() # 可选:将首期无对比值的空值替换为原表的N/A格式 df["Difference from prev. month"] = df["Difference from prev. month"].fillna("N/A") # 计算结果写回Excel df.to_excel("就业数据_计算完成.xlsx", index=False)
方案2:原生Python实现(无第三方库依赖)
如果不想安装额外依赖,可以通过字典缓存每个行业的上一期就业值,逐行遍历计算,从根源上避免固定索引偏移的问题:
# 缓存结构:key为行业名称,value为该行业上一个统计周期的就业人数 prev_period_cache = {} result = [] # --- 读取数据部分,可根据你的实际文件格式调整 --- # 这里以csv格式为例,若读取Excel可替换为对应读取逻辑 import csv with open("就业数据.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) table_headers = reader.fieldnames # 注意:请确保数据已按统计周期从早到晚排序,若周期顺序混乱需先排序 for row in reader: industry = row["Industry"] current_jobs = int(row["No. of jobs"]) # 匹配同行业上期值计算差值 if industry in prev_period_cache: row["Difference from prev. month"] = current_jobs - prev_period_cache[industry] else: row["Difference from prev. month"] = "N/A" # 更新缓存为当期值,供下一周期计算使用 prev_period_cache[industry] = current_jobs result.append(row) # --- 写出结果部分 --- with open("就业数据_计算结果.csv", "w", encoding="utf-8", newline="") as f: writer = csv.DictWriter(f, fieldnames=table_headers) writer.writeheader() writer.writerows(result)
注意:两种方案都要求数据的统计周期顺序是从早到晚排列的,如果原表的周期顺序混乱,需要先按时间维度排序后再计算差值。
内容的提问来源于stack exchange,提问作者IsaDavRod
相关产品推荐
相关产品推荐

