如何按stormid分组获取vmax最大值并添加至另一DataFrame
解决方案
原始数据集
| season | stormid | vmax | |
|---|---|---|---|
| 0 | 1970 | SH071970 | 1 |
| 1 | 1970 | SH071971 | 6 |
| 2 | 1970 | SH071970 | 3 |
| 3 | 1970 | SH071971 | 9 |
你的代码df['vmax'] = df['stormid']['vmax'].max()错误在于:df['stormid']是Series对象,不存在vmax索引,会触发KeyError。下面提供两种可行方法:
方法1:分组计算+合并(推荐,高效)
先通过分组得到每个stormid对应的vmax最大值,再将结果合并到目标DataFrame中,这是Pandas最优的矢量化操作方式:
# 1. 从原始DataFrame计算每个stormid的vmax最大值 storm_vmax_max = df.groupby('stormid')['vmax'].max().reset_index() # 重命名列,避免和目标DataFrame的列名冲突 storm_vmax_max.rename(columns={'vmax': 'vmax_max'}, inplace=True) # 2. 合并到目标DataFrame(假设目标DataFrame名为target_df,且包含stormid列) target_df = target_df.merge(storm_vmax_max, on='stormid', how='left')
执行后storm_vmax_max的结果为:
| stormid | vmax_max |
|---|---|
| SH071970 | 3 |
| SH071971 | 9 |
target_df会新增vmax_max列,自动匹配每个stormid对应的最大值。
方法2:遍历目标DataFrame(满足你的循环需求)
如果必须用循环,建议先构建stormid到最大值的映射字典,再遍历取值(比直接在循环中查询原始DataFrame高效):
# 1. 构建stormid与vmax最大值的映射字典 storm_vmax_map = df.groupby('stormid')['vmax'].max().to_dict() # 2. 遍历目标DataFrame,新增最大值列 # 方式一:用map矢量化映射(推荐,比显式循环快) target_df['vmax_max'] = target_df['stormid'].map(storm_vmax_map) # 方式二:显式循环(不推荐,数据量大时效率低) for idx, row in target_df.iterrows(): # 若stormid不存在映射,返回None target_df.loc[idx, 'vmax_max'] = storm_vmax_map.get(row['stormid'], None)
注意:显式循环会大幅降低处理效率,仅在特殊场景下使用,优先选择矢量化操作。
内容的提问来源于stack exchange,提问作者MateaMar
相关产品推荐
相关产品推荐

