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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:31:51