使用数据帧列作为索引构建 xarray

问题描述 投票:0回答:1

我正在处理一个大型命名桥数据集,每个桥都有多个属性。有些属性是永久的,但有几个属性每年都会更新。我收到的数据是一个 .csv 文件,其中每个项目的列包括“名称”、“年份”、“X”、“Y”、“Z”。我正在尝试将其变成 3d xarray。数据集的示例如下:

Table of attributes for each item

请注意,这是一个显着减少的数组。 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 多重索引/面板,但这似乎已被弃用,我想避免继续使用它。理想情况下,我会有类似于这样的结构: Stacked 3d array example

最后,我希望能够对多个桥梁进行一年的分析(2015 年的平均 ConditionX),以及特定桥梁在可用时间范围内的状况。有谁对如何根据需要将此数据放入 xarray 或可能更适用的不同方法有建议吗?

python pandas multidimensional-array python-xarray
1个回答
0
投票

我希望这些代码对你有用:)

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
© www.soinside.com 2019 - 2024. All rights reserved.