如何利用Pandas多级索引提取DataFrame中的lat和long值?
正确读取并提取站点lat/long的优雅方案
首先,你的原始数据结构逻辑是:
- 第1行:站点名称(作为列标识)
- 第2-4行:对应站点的lat、long、elv属性参数
- 第5行及以后:日期与各站点的观测数值
你当前用header=[0,1,2,3]的读取方式会把属性行(lat/long/elv)强行作为列的多级索引,混淆了数据结构层级,反而增加后续操作复杂度。更合理的做法是拆分站点属性与时间序列数据,充分利用Pandas的索引特性管理。
步骤1:读取并拆分数据
import pandas as pd # 读取全部原始数据,不预设表头 df_raw = pd.read_csv(f_name, header=None) # 提取站点属性数据(lat/long/elv) stations = df_raw.iloc[0, 1:].values # 获取所有站点名称 # 转置属性行,设置列名与站点索引 attrs_df = df_raw.iloc[1:4, 1:].T attrs_df.columns = ['lat', 'long', 'elv'] attrs_df.index = stations attrs_df = attrs_df.astype(int) # 转换为数值类型 # 提取时间序列数据 ts_df = df_raw.iloc[4:, :] ts_df.columns = ['date'] + list(stations) # 设置列名 ts_df['date'] = pd.to_datetime(ts_df['date']) ts_df = ts_df.set_index('date').astype(int) # 日期设为索引并转换数值类型
步骤2:提取lat和long
此时attrs_df已规整为以站点为索引、属性为列的结构,直接筛选目标列即可:
lat_long_df = attrs_df[['lat', 'long']]
如果坚持使用你当前的多级表头读取方式(不推荐,结构逻辑不合理),可以通过列多级索引提取属性值:
# 基于你已读取的dfr对象 lat_long_df = pd.DataFrame({ col[0]: {'lat': col[1], 'long': col[2]} for col in dfr.columns }).T.astype(int)
这样可一次性获取所有站点的lat/long数据,无需分两次读取。
内容的提问来源于stack exchange,提问作者diedro
相关产品推荐
相关产品推荐

