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

如何将含多属性的桥梁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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:27:41