如何为含坐标与时间戳的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
相关产品推荐
相关产品推荐

