我正在处理一个大型命名桥数据集,每个桥都有多个属性。有些属性是永久的,但有几个属性每年都会更新。我收到的数据是一个 .csv 文件,其中每个项目的列包括“名称”、“年份”、“X”、“Y”、“Z”。我正在尝试将其变成 3d xarray。数据集的示例如下:
请注意,这是一个显着减少的数组。 30 年来,我处理过大约 40,000 座桥梁,每座桥梁都有 35 种不同的属性。属性是混合类型,大约一半是字符串值,一半是数字。
我尝试过使用数据帧字典或一次只获取一个属性。我认为这不是很有效。我对使用 xarray 一段时间很感兴趣,但一直无法弄清楚如何根据数据框中的现有列创建新维度。我已经根据 xarray 页面尝试了以下方法来创建新的 DataArray:
import pandas as pd
import numpy as np
d = {'Name': ['BridgeA','BridgeB','BridgeC',
'BridgeA','BridgeB','BridgeC',
'BridgeA','BridgeB','BridgeC',
'BridgeA','BridgeB','BridgeC'],
'Built': [2000, 1995, 2004,
2000, 1995, 2004,
2000, 1995, 2004,
2000, 1995, 2004],
'Type': ['Steel','Steel','Concrete',
'Steel','Steel','Concrete',
'Steel','Steel','Concrete',
'Steel','Steel','Concrete'],
'Year': [2015, 2015, 2015,
2016, 2016, 2016,
2017, 2017, 2017,
2018, 2018, 2018],
'ConditionX': [10, 10, 10, 10, 9, 7, 9, 5, 5, 2, 8, 4],
'ConditionY': [10, 10, 10, 9, 9, 8, 8, 4, 1, 3, 4, 5],
'ConditionZ': [10, 10, 10, 9, 9, 10, 5, 6, 3, 6, 6, 6]}
df = pd.DataFrame(data=d)
da = xr.DataArray(data = df[['Built','Type','ConditionX','ConditionY','ConditionZ']],
dims = ('Name','Year'),
coords = {'Name': df['Name'],
'Year': df['Year']})
我尝试了 DataArray 调用的几种不同安排,但我不确定如何将其变成“三个”维度,考虑到一维可以是属性列表。我还尝试了 pd.Dataframe.to_xarray,它一直有效,直到我尝试从“年份”列添加维度。以前我使用过 pandas 多重索引/面板,但这似乎已被弃用,我想避免继续使用它。理想情况下,我会有类似于这样的结构:
最后,我希望能够对多个桥梁进行一年的分析(2015 年的平均 ConditionX),以及特定桥梁在可用时间范围内的状况。有谁对如何根据需要将此数据放入 xarray 或可能更适用的不同方法有建议吗?
我希望这些代码对你有用:)
def app_func(d:pd.DataFrame):
return d.sort_values("Year")
d = df.groupby("Name", dropna=False).apply(app_func)
name = d.Name.unique()
year = d.Year.unique()
attr = d.drop(["Name","Year"], axis=1).columns
da = xr.DataArray(
data = d.drop(["Name","Year"], axis=1).values.reshape(name.size, year.size, attr.size),
dims = ["Name", "Year", "Attr"],
coords = {
"Name":name,
"Year":year,
"Attr":attr
}
)
da