如何使用Pandas或Xarray最优表示带属性的二维数据
最优方案:Pandas 多级列索引(MultiIndex)
你给出的Excel是典型的复合表头结构,第一行表头是数据类型、第二行是城市名、行索引为年份,直接用Pandas的双级列索引结构存储即可完美匹配需求,无需额外维护元数据,类型信息会作为列索引的第一级内置在数据结构中。
数据导入构造代码
import pandas as pd # 读取Excel时指定前两行为表头、第一列为行索引 df = pd.read_excel("你的文件路径.xlsx", header=[0, 1], index_col=0) # 给索引命名方便后续筛选调用 df.columns.names = ["类型", "城市"] df.index.name = "年份"
需求实现方法
1. 筛选指定类型的所有城市数据绘图
直接用Pandas内置的xs方法按层级筛选即可:
# 筛选所有Type A的城市数据 type_a_df = df.xs("Type A", level="类型", axis=1) # 直接绘制趋势图,年份自动作为X轴,每列对应一个城市的趋势线 type_a_df.plot(ylabel="数值", title="Type A 各城市年度趋势")
2. 所有城市无差别绘制趋势图
可以选择将列名合并为「类型-城市」格式方便图例区分:
all_city_df = df.copy() # 合并两级列名,避免图例显示为元组 all_city_df.columns = [f"{typ}-{city}" for typ, city in df.columns] all_city_df.plot(ylabel="数值", title="所有城市年度趋势")
可选方案:Xarray 多维数据集
如果你的数据量级更大、后续还要扩展更多维度,也可以转成Xarray Dataset存储:
import xarray as xr # 从Pandas多级表转成Xarray结构 ds = df.stack([*df.columns.names]).to_xarray() # 筛选Type A绘图 ds.sel(类型="Type A").plot(hue="城市", x="年份") # 所有城市绘图 ds.plot(hue="城市", x="年份")
方案优势
对比你之前考虑的「城市做列+单独维护类型元数据」的方案,多级索引/多维数组的方式直接把类型和城市的关联关系内置在数据结构中,无需额外维护映射表,筛选、计算、绘图都可以调用官方内置方法,不会出现映射错误的问题。
内容的提问来源于stack exchange,提问作者Rodrigo Silva
相关产品推荐
相关产品推荐

