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

Pandas按x分组计算next_crossing_down最大值填充整组新列的方法

错位原因

groupby(['x'])['next_crossing_down'].max()返回的是以分组键x为索引的短Series(仅包含x=1、x=2两个索引项),直接赋值给DataFrame新列时,pandas默认按索引对齐规则匹配值,而非按行顺序填充,因此只有原DataFrame索引为1、2的行会匹配到对应值,其余行全部为NaN,出现错位。

正确实现

使用transform()方法可将分组计算结果按原DataFrame的行索引一一映射回每一行,自动匹配所属分组的计算值,避免错位。
同时根据你期望的效果:原next_crossing_down为NaN的行,新列也保持为NaN,需额外做一层空值掩码处理,完整代码如下:

import pandas as pd
# 构造原始数据
cars = pd.DataFrame({'x': [1,1,1,1,1,1,1,2,2,2,2],
                     'y': [7,None,13,14,22,None,9,13,14,15,16],
                     'next_crossing_down': [5,None,10,10,20,None,5,10,10,10,15]})
# 计算每个x分组的最大值,通过transform匹配回原行
group_max = cars.groupby(['x'])['next_crossing_down'].transform('max')
# 仅在原next_crossing_down非空的行填充最大值,原空值行保留NaN
cars['next_crossing_down_max'] = group_max.where(cars['next_crossing_down'].notna())
输出效果

执行上述代码后得到的结果(已修正示例中第6行的笔误,x=1分组的最大值为20而非15):

x     y  next_crossing_down  next_crossing_down_max
0   1   7.0                 5.0                    20.0
1   1   NaN                 NaN                     NaN
2   1  13.0                10.0                    20.0
3   1  14.0                10.0                    20.0
4   1  22.0                20.0                    20.0
5   1   NaN                 NaN                     NaN
6   1   9.0                 5.0                    20.0
7   2  13.0                10.0                    15.0
8   2  14.0                10.0                    15.0
9   2  15.0                10.0                    15.0
10  2  16.0                15.0                    15.0
简化场景说明

若不需要保留原空值行的NaN,直接需要给分组内所有行(包括原列是NaN的行)填充所属分组的最大值,可直接使用单行代码:

cars['next_crossing_down_max'] = cars.groupby(['x'])['next_crossing_down'].transform('max')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 03:54:10