如何用Pandas将二维热带气旋数据集转换为三维结构?
解决方案:用连续分组标识构建多层索引
核心思路是识别连续的热带气旋区块——同一个气旋的记录是连续的(即使跨年),不同时期的同名气旋则是不连续的。通过标记TC_name的变化点生成唯一组ID,再结合组内序号构建多层索引,就能完美区分所有独立气旋。
实现代码
import pandas as pd data = {'TC_name':['RITA','RITA','IDA','IDA','IDA','IDA','RITA','RITA','RITA'], 'Year':[2020,2020,2020,2020,2020,2021,2021,2021,2021]} df = pd.DataFrame(data) # 1. 生成连续组的唯一ID:TC_name与上一行不同时,组号自动递增 df['group_id'] = df['TC_name'].ne(df['TC_name'].shift()).cumsum() # 2. 生成每个组内的行序号(从1开始计数) df['inner_idx'] = df.groupby('group_id').cumcount() + 1 # 3. 设置多层索引并清理临时列 result = df.set_index(['group_id', 'inner_idx']).drop(columns=['group_id', 'inner_idx']) print(result)
输出结果
TC_name Year group_id inner_idx 1 1 RITA 2020 2 RITA 2020 2 1 IDA 2020 2 IDA 2020 3 IDA 2020 4 IDA 2021 3 1 RITA 2021 2 RITA 2021 3 RITA 2021
关键逻辑说明
df['TC_name'].ne(df['TC_name'].shift()):对比当前行与上一行的TC_name,返回布尔值序列(不同为True,相同为False)。.cumsum():对布尔值累加(True=1,False=0),自动为每一段连续的同名气旋分配唯一组号,彻底区分不同时期的同名气旋。groupby('group_id').cumcount() +1:为每个组内的记录生成从1开始的序号,符合你需要的格式。
可选优化:更直观的组标识
如果需要让组索引更易读,可以将组ID替换为「组号_气旋名_起始年份」的复合标识:
# 生成包含年份和名称的组标识 df['group_label'] = df['group_id'].apply( lambda x: f"{x}_{df.loc[df['group_id']==x, 'TC_name'].iloc[0]}_{df.loc[df['group_id']==x, 'Year'].min()}" ) result = df.set_index(['group_label', 'inner_idx']).drop(columns=['group_id', 'group_label', 'inner_idx'])
输出的索引会变为1_RITA_2020、2_IDA_2020这类形式,便于快速识别每组对应的气旋信息。
内容的提问来源于stack exchange,提问作者Feng Hu
相关产品推荐
相关产品推荐

