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

pandas DataFrame按列比较行 迁移值并删除重复行实现方法

Pandas 按年、季度分组合并行值并去重实现

问题场景

待处理的pandas DataFrame包含Year、Quarter、Year-Month、Current Value、Future Value、Date共6个字段,样例数据如下:

  • 2021、Q3、2021-10、0.411、NaN、2021-10-01
  • 2021、Q4、2022-01、-0.100、NaN、2022-01-01
  • 2022、Q1、2022-04、-0.224、NaN、2022-04-01
  • 2022、Q1、2022-03、0.110、0.092、2022-03-01

可以看到最后两行的Year、Quarter取值重复,但Year-Month取值不同,需要按以下规则处理:

  1. 识别所有Year、Quarter取值重复的行分组
  2. 将每组最后一行的有效(非NaN)字段值,迁移覆盖到同组上一行的对应位置
  3. 覆盖完成后删除每组的最后一行冗余数据
    预期最终输出3行数据,前两行与原数据一致,第三行取值为:2022、Q1、2022-04、-0.224、0.092、2022-04-01。

实现代码

import pandas as pd
import numpy as np

# 构造样例数据集
df = pd.DataFrame(
    [
        [2021, "Q3", "2021-10", 0.411, np.nan, "2021-10-01"],
        [2021, "Q4", "2022-01", -0.100, np.nan, "2022-01-01"],
        [2022, "Q1", "2022-04", -0.224, np.nan, "2022-04-01"],
        [2022, "Q1", "2022-03", 0.110, 0.092, "2022-03-01"],
    ],
    columns=["Year", "Quarter", "Year-Month", "Current Value", "Future Value", "Date"],
)

# 核心处理流程
# 给同Year+Quarter分组内的行打倒序编号,每组最后一行编号为0
df["group_rev_rank"] = df.groupby(["Year", "Quarter"]).cumcount(ascending=False)
# 提取每组最后一行的值,向上平移一行和组内上一行对齐
fill_source = df[df["group_rev_rank"] == 0].groupby(["Year", "Quarter"]).ffill().shift(-1)
# 用对齐后的非空值覆盖原表对应位置的空值
df = df.combine_first(fill_source)
# 删除每组最后一行冗余数据,清理临时列
df = df[df["group_rev_rank"] != 0].drop(columns=["group_rev_rank"]).reset_index(drop=True)

结果校验

执行上述代码后打印df,输出结果如下,完全匹配预期:

Year Quarter Year-Month  Current Value  Future Value        Date
0  2021      Q3    2021-10          0.411           NaN  2021-10-01
1  2021      Q4    2022-01         -0.100           NaN  2022-01-01
2  2022      Q1    2022-04         -0.224         0.092  2022-04-01

该逻辑同时兼容同组存在2行以上重复的场景,不需要额外写循环分支处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:09:18