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取值不同,需要按以下规则处理:
- 识别所有
Year、Quarter取值重复的行分组 - 将每组最后一行的有效(非NaN)字段值,迁移覆盖到同组上一行的对应位置
- 覆盖完成后删除每组的最后一行冗余数据
预期最终输出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
相关产品推荐
相关产品推荐

