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

如何为含坐标与时间戳的Pandas DataFrame创建多重索引?

没问题,这其实是Pandas里处理宽表转长表+多重索引的经典场景,我来一步步帮你搞定:

步骤1:将宽格式DataFrame转为长格式

你的当前DataFrame是宽格式:行对应y坐标(0-229),列对应x坐标(0-639)+ 时间戳ts。要做多重索引,首先得把它转成长格式,让每一行对应一个(ts, y, x)组合和对应的温度值val。

假设单个帧的DataFrame叫df_single,执行以下代码:

import pandas as pd

# 1. 把行索引(也就是y坐标)转成单独的列
df_single = df_single.reset_index().rename(columns={'index': 'y'})

# 2. 用melt将x坐标列(0-639)拆成行,保留y、ts和温度值
df_long = df_single.melt(
    id_vars=['y', 'ts'],  # 要保留的列
    var_name='x',         # 原来的x列名会变成这个列的取值
    value_name='val'      # 温度值的列名
)

# 3. 把x列转成整数类型(原来的列名是字符串,比如'0',转成int更方便索引)
df_long['x'] = df_long['x'].astype(int)

# 可选:把ts转成datetime类型,方便后续按时间筛选
df_long['ts'] = pd.to_datetime(df_long['ts'])
步骤2:设置多重索引

现在长格式的DataFrame已经有了ts、y、x三列,直接设置它们为多重索引即可。索引顺序可以根据你的查询习惯调整:

# 如果你更常先按时间戳查询,再找坐标:
df_multi = df_long.set_index(['ts', 'y', 'x'])

# 如果你更常先按坐标查询,再看不同时间的数值:
# df_multi = df_long.set_index(['y', 'x', 'ts'])
步骤3:拼接多个帧

当你有多个同结构的帧(每个帧都按上面的步骤转成了长格式),直接用pd.concat拼接就行:

# 假设你已经处理好了多个长格式DataFrame:df_long1, df_long2, df_long3...
all_frames = [df_long1, df_long2, df_long3]
combined_df = pd.concat(all_frames).set_index(['ts', 'y', 'x'])

# 可选:对索引排序,让查询更高效
combined_df = combined_df.sort_index()
步骤4:查询示例

现在你可以轻松定位任意坐标+时间戳的数值了:

  • 查询坐标(2, 0)在所有时间戳的数值(如果索引是['y', 'x', 'ts']):
    combined_df.loc[(2, 0)]
    
  • 查询坐标(2, 0)在所有时间戳的数值(如果索引是['ts', 'y', 'x']):
    combined_df.xs((2, 0), level=['y', 'x'])
    
  • 查询特定时间戳下(2, 0)的数值:
    combined_df.loc[('2024-05-20 12:00:00', 2, 0)]
    

内容的提问来源于stack exchange,提问作者Alex Pab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:22:51