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
相关产品推荐
相关产品推荐

