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

如何基于列条件填充pandas DataFrame行并自动匹配上年列计算同比差

实现方案

不需要硬编码列头,通过正则自动识别年月格式列、匹配上一年度同月份列即可完成需求,完整实现逻辑如下:

核心逻辑

  • 用正则匹配所有YYYY-MM格式的月份列,自动过滤ID、val这类非时间维度列
  • 对每个月份列,拆分年份和月份,年份减1即可得到上一年同月份的列名
  • 存在对应上年列的,计算两列的数值差;不存在对应上年列的(即最早年份的月份列)填充空值
  • 非月份列单独处理:ID取原表最大ID+1,其他统计列填充空值
  • 将组装好的新行追加到原DataFrame末尾

完整代码

import pandas as pd
import re

# 初始化示例数据
df = pd.DataFrame({
    'ID': [1,2,3,4],
    '2000-01': [2847,1338,3301,1425],
    '2000-02': [2861,1343,3311,1422],
    '2000-03': [2875,1348,3321,1419],
    '2001-01': [2890,1353,3331,1416],
    '2001-02': [2904,1358,3341,1413],
    'val': [94717,70105,60307,79888]
})

new_row = {}
ym_col_pattern = re.compile(r'^(\d{4})-(\d{2})$')
all_columns = df.columns.tolist()

for col in all_columns:
    res = ym_col_pattern.match(col)
    if res:
        # 拆分年、月,生成上年同月份列名
        cur_year, cur_month = int(res.group(1)), res.group(2)
        prev_col = f"{cur_year - 1}-{cur_month}"
        if prev_col in all_columns:
            # 差值计算逻辑可按需修改,这里默认按列总和计算差值
            new_row[col] = df[col].sum() - df[prev_col].sum()
        else:
            new_row[col] = pd.NA
    else:
        # 非月份列处理
        new_row[col] = df['ID'].max() + 1 if col == 'ID' else pd.NA

# 追加新行
df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True)

说明

你给出的预期输出中差值写为-9属于笔误,按列总和计算的话2001-01列差值为79、2001-02列差值为69。如果你需要其他计算规则(比如取最后一行的差值、计算差值的均值等),只需要修改new_row[col]的赋值逻辑即可,列自动匹配的部分不需要做任何改动,后续新增其他年份的月份列也可以自动识别处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:54:32