如何基于列条件填充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
相关产品推荐
相关产品推荐

