如何使用pandas按分组获取各列按年份考虑NaN的最新非空值?
Pandas 实现方法
核心实现逻辑
要实现“每个Name分组下,按年份维度取COL1/COL2/COL3的最新非NaN值”的需求,核心是两点:
- 保证每个Name组内的行按年份从小到大排序,确保行顺序和年份新旧完全对应
- 对分组后的每个数值列,直接提取组内最后一个非缺失值,该值就是对应列最新的非NaN值
具体实现代码
- 首先对原数据框做排序,避免原数据行顺序混乱导致取值错误:
df_sorted = df.sort_values(by=["Name", "Year"], ascending=[True, True])
- 按Name分组,仅针对需要提取的COL1、COL2、COL3三列,取组内最后一个非空值,最后将分组后的Name重置为普通列即可得到目标结果:
result = df_sorted.groupby("Name")[["COL1", "COL2", "COL3"]].last().reset_index()
结果校验
按照上述代码运行后,输出结果将和题目要求的目标数据框完全一致:
| Name | COL1 | COL2 | COL3 |
|---|---|---|---|
| A | 15.50 | 1610 | 14214 |
| B | 19.30 | 1610 | NaN |
| C | 22.74 | 2027 | 1810 |
注意事项
- 排序步骤是必须项:如果原数据在Name组内的行顺序不是按年份升序排列,直接取值会错位,必须通过
sort_values保证行顺序和年份新旧一致。 - 该方法为pandas内置的向量化计算逻辑,相比逐行遍历、apply自定义函数的实现方式,在大体积数据集上的运行效率要高很多。
groupby.last()默认会自动跳过NaN值,仅当列在整个分组内全为NaN时,才会返回缺失值,和需求规则完全匹配。
内容的提问来源于stack exchange,提问作者Samir Hinojosa
相关产品推荐
相关产品推荐

