如何将含多属性的桥梁CSV数据转换为三维xarray
解决方案:将桥梁数据集转换为Xarray三维结构
核心步骤:从宽表DataFrame生成三维Xarray Dataset
针对你的数据集(40000座桥梁、30年、35种混合属性),最直接的方案是先将DataFrame转换为多索引结构,再通过Xarray的堆叠功能生成Name(桥梁名)、Year(年份)、Attribute(属性)三维结构,具体代码如下:
import pandas as pd import xarray as xr # 1. 读取CSV数据 df = pd.read_csv("bridges_data.csv") # 2. 设置多索引:将Name和Year设为行索引 df_multi = df.set_index(["Name", "Year"]) # 3. 转换为Xarray Dataset(此时每个属性是独立变量) ds = df_multi.to_xarray() # 4. 将所有属性变量堆叠为新的`Attribute`维度,得到三维结构 ds_3d = ds.to_array(dim="Attribute").transpose("Name", "Year", "Attribute")
针对混合类型属性的优化
由于你的属性包含字符串和数值类型,直接堆叠会生成object类型数组,可按需分离两类属性以提升性能和内存效率:
# 筛选数值型属性(排除Name、Year) numeric_cols = [col for col in df.columns if pd.api.types.is_numeric_dtype(df[col]) and col not in ["Name", "Year"]] ds_numeric = df_multi[numeric_cols].to_xarray().to_array(dim="Attribute").transpose("Name", "Year", "Attribute") # 筛选字符串型属性 string_cols = [col for col in df.columns if pd.api.types.is_string_dtype(df[col]) and col not in ["Name", "Year"]] ds_string = df_multi[string_cols].to_xarray().to_array(dim="Attribute").transpose("Name", "Year", "Attribute")
静态属性的单独处理
对于X、Y这类永久性属性(每年值不变),可单独提取为Xarray坐标或独立变量,避免重复存储:
# 提取每个桥梁的静态属性(取首次出现的值) static_attrs = df.drop_duplicates("Name").set_index("Name")[["X", "Y"]] static_ds = static_attrs.to_xarray() # 合并到三维数据集中 ds_3d = ds_3d.merge(static_ds)
常用分析操作示例
1. 单年多桥分析(如2015年ConditionX平均值)
# 筛选2015年、ConditionX属性,计算平均值 mean_condition_2015 = ds_3d.sel(Year=2015, Attribute="ConditionX").mean()
2. 单桥跨时间分析(如某座桥的ConditionX时间序列)
# 筛选指定桥梁、ConditionX属性,获取时间序列 bridge_a_condition = ds_3d.sel(Name="BridgeA", Attribute="ConditionX")
替代方案:使用Melt转窄表后生成Xarray
如果上述堆叠方式不符合需求,也可先将宽表转为窄表,再生成三维结构:
# 将宽表转为窄表:Name、Year作为标识,其余列为属性 melted_df = df.melt(id_vars=["Name", "Year"], var_name="Attribute", value_name="Value") # 设置多索引并转Xarray melted_df = melted_df.set_index(["Name", "Year", "Attribute"]) ds_melted = melted_df.to_xarray()
这种方式生成的Dataset以Value为唯一变量,维度同样为Name、Year、Attribute,适合统一处理所有属性。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

