- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从 Pandas
过渡到 Xarray
以获取 N-Dimensional DataArrays
以扩展我的轨道。
实际上,我将有一堆不同的pd.DataFrames
(在本例中为 row=month,col=attribute)沿特定轴(下面模拟示例中的患者)我想合并(不使用面板或 multindex :),谢谢)。我想将它们转换为 xr.DataArrays
,这样我就可以在它们的基础上构建维度。我制作了一个模拟数据集来说明我在说什么。
对于我制作的这个数据集,假设 100 名患者,12 个月,10000 个属性,3 个重复(每个属性)
,这将是一个典型的 4D 数据集。基本上,我通过 mean
压缩每个属性的 3 个副本
,所以我最终得到一个 2D pd.DataFrame
(row=months, col=attributes) 这个 DataFrame 是我字典中的值,它来自的患者是关键(即 (patient_x : DataFrame_X) )
我还将介绍我使用 np.ndarray
占位符的方法,但是如果我可以从字典生成 N 维 DataArray 会非常方便其键为 patient_x,值为 DataFrame_X
如何使用 Pandas DataFrames
字典中的 Xarray
创建 N 维 DataArray
?
import xarray as xr
import numpy as np
import pandas as pd
np.random.seed(1618033)
#Set dimensions
a,b,c,d = 100,12,10000,3 #100 patients, 12 months, 10000 attributes, 3 replicates
#Create labels
patients = ["patient_%d" % i for i in range(a)]
months = [j for j in range(b)]
attributes = ["attr_%d" % k for k in range(c)]
replicates = [l for l in range(d)]
coords = [patients,months,attributes]
dims = ["Patients","Months","Attributes"]
#Dict of DataFrames
D_patient_DF = dict()
for i, patient in enumerate(patients):
A_placeholder = np.zeros((b,c))
for j, month in enumerate(months):
#Attribute x Replicates
A_attrReplicates = np.random.random((c,d))
#Collapse into 1D Vector
V_attrExp = A_attrReplicates.mean(axis=1)
#Fill array with row
A_placeholder[j,:] = V_attrExp
#Assign dataframe for every patient
DF_data = pd.DataFrame(A_placeholder, index = months, columns = attributes)
D_patient_DF[patient] = DF_data
xr.DataArray(D_patient_DF).dims
#() its empty
D_patient_DF
#{'patient_0': attr_0 attr_1 attr_2 attr_3 attr_4 attr_5 attr_6 \
# 0 0.445446 0.422018 0.343454 0.140700 0.567435 0.362194 0.563799
# 1 0.440010 0.548535 0.810903 0.482867 0.469542 0.591939 0.579344
# 2 0.645719 0.450773 0.386939 0.418496 0.508290 0.431033 0.622270
# 3 0.555855 0.633393 0.555197 0.556342 0.489865 0.204200 0.823043
# 4 0.916768 0.590534 0.597989 0.592359 0.484624 0.478347 0.507789
# 5 0.847069 0.634923 0.591008 0.249107 0.655182 0.394640 0.579700
# 6 0.700385 0.505331 0.377745 0.651936 0.334216 0.489728 0.282544
# 7 0.777810 0.423889 0.414316 0.389318 0.565144 0.394320 0.511034
# 8 0.440633 0.069643 0.675037 0.365963 0.647660 0.520047 0.539253
# 9 0.333213 0.328315 0.662203 0.594030 0.790758 0.754032 0.602375
# 10 0.470330 0.419496 0.171292 0.677439 0.683759 0.646363 0.465788
# 11 0.758556 0.674664 0.801860 0.612087 0.567770 0.801514 0.179939
最佳答案
从 DataFrame 的字典中,您可以将每个值转换为 DataArray(添加维度标签),将结果加载到数据集中,然后转换为 DataArray:
variables = {k: xr.DataArray(v, dims=['month', 'attribute'])
for k, v in D_patient_DF.items()}
combined = xr.Dataset(variables).to_array(dim='patient')
print(combined)
但是,请注意结果不一定按排序顺序排列,而是使用字典迭代的任意顺序。如果你想要排序顺序,你应该使用 OrderedDict 代替(在上面设置 variables
之后插入):
variables = collections.OrderedDict((k, variables[k]) for k in patients)
这个输出:
<xarray.DataArray (patient: 100, month: 12, attribute: 10000)>
array([[[ 0.61176399, 0.26172557, 0.74657302, ..., 0.43742111,
0.47503291, 0.37263983],
[ 0.34970732, 0.81527751, 0.53612895, ..., 0.68971198,
0.68962168, 0.75103198],
[ 0.71282751, 0.23143891, 0.28481889, ..., 0.52612376,
0.56992843, 0.3483683 ],
...,
[ 0.84627257, 0.5033482 , 0.44116194, ..., 0.55020168,
0.48151353, 0.36374339],
[ 0.53336826, 0.59566147, 0.45269417, ..., 0.41951078,
0.46815364, 0.44630235],
[ 0.25720899, 0.18738289, 0.66639783, ..., 0.36149276,
0.58865823, 0.33918553]],
...,
[[ 0.42933273, 0.58642504, 0.38716496, ..., 0.45667285,
0.72684589, 0.52335464],
[ 0.34946576, 0.35821339, 0.33097093, ..., 0.59037927,
0.30233665, 0.6515749 ],
[ 0.63673498, 0.31022272, 0.65788374, ..., 0.47881873,
0.67825066, 0.58704331],
...,
[ 0.44822441, 0.502429 , 0.50677081, ..., 0.4843405 ,
0.84396521, 0.45460029],
[ 0.61336348, 0.46338301, 0.60715273, ..., 0.48322379,
0.66530209, 0.52204897],
[ 0.47520639, 0.43490559, 0.27309414, ..., 0.35280585,
0.30280485, 0.77537204]]])
Coordinates:
* month (month) int64 0 1 2 3 4 5 6 7 8 9 10 11
* patient (patient) <U10 'patient_80' 'patient_73' 'patient_79' ...
* attribute (attribute) object 'attr_0' 'attr_1' 'attr_2' 'attr_3' ...
或者,您可以创建一个 2D DataArrays 列表,然后使用 concat
:
patient_list = []
for i, patient in enumerate(patients):
df = ...
array = xr.DataArray(df, dims=['patient', 'attribute'])
patient_list.append(df)
combined = xr.concat(patient_list, dim=pd.Index(patients, name='patient')
这会给出相同的结果,并且可能是最干净的代码。
关于python - 从 2D DataFrames/Arrays 的字典创建 DataArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36948476/
我正在尝试使用有关单元格的一些元信息填充 DataArray,以将其添加到数据集中。 airtemps = xr.tutorial.load_dataset('air_temperature') ai
DataArray.mean 不保留取决于应用平均值的维度的坐标。 注意:XLAT 和 XLONG 与时间无关;然而,一些 netcdf 文件具有沿这两个方向的时间坐标。 我有这个 netcdf 文件
我的函数内部有一个 DataFrame: using DataFrames myservs = DataFrame(serverName = ["elmo", "bigBird", "Oscar",
我无法弄清楚 xarray 的一些基本使用模式。这是我过去可以在 numpy 中轻松完成的事情:(在另一个数组中设置满足特定条件的元素) import numpy as np q_index = np
在 xarray 中使用 DataArray 对象是查找所有具有值 != 0 的单元格的最佳方法。 例如在 Pandas 我会做 df.loc[df.col1 > 0] 我的具体例子是我试图查看 3
对于我的 Python 包 numericalmodel这应该有助于对简单的数值模型进行原型(prototype)设计,我为自描述数据集编写了类。我最近偶然发现了很棒的 xarray library现
很简单的问题,但我在网上找不到答案。我有一个 Dataset我只想添加一个名为 DataArray到它。类似 dataset.add({"new_array": new_data_array}) .我
假设我有以下 DataArray arr = xarray.DataArray(np.arange(6).reshape(2,3), dims=['A'
假设以下代码具有 xarray.DataArray有两个维度和一个坐标: import numpy as np from xarray import DataArray data = np.rando
我有一个 xarray DataArray,它的形状如下所示 (1,5,73,144,17),我正在尝试删除或删除“级别”坐标。所以,最终,我需要变量具有形状 = (1,5,73,144)。 stdn
我有一个 3 维 xarray DataArray,其中两个维度代表 x-y 网格,第三个维度代表彼此“堆叠”的网格层数。空的 DataArray 看起来像这样: import xarray as x
我正在尝试向 DataArray 添加一个具有一定长度的新维度。 我尝试使用expand_dims方法,其文档表明我应该能够做到这一点 http://xarray.pydata.org/en/stab
我正在使用 laravel 的 Model::create() 函数在数据库中创建一个新条目,但我传递到该函数的数组失败,因为它删除了其中一行。 这是我的数组全静态。这也符合我的数据库表的样子。 $d
我有一个 xarray.DataArray: array([ 5.437614e+01, 2.090367e+02, 3.687384e+02, ..., 5.121467e-02,
我有一个一维的 DataArray,每个值对应一个 ID。我正在尝试以相同的格式创建一个新数组,其中包含值超出限制的任何情况下的值和 ID 我尝试过使用xr.DataArray.where(condi
我需要向 DataArray 添加一个维度,填充新维度中的值。这是原始数组。 a_size = 10 a_coords = np.linspace(0, 1, a_size) b_size = 5 b
我对python有点陌生。我有一个 xarray DataArray 包含一个由浮点数组成的变量。这些浮点数应该是秒。我想将这些浮点数添加到给定日期: 2021-01-01 00:00:00 + 1
我有一个名为 rio 的 DataArray 对象。 In [59]: rio Out[59]: array([[[0, 0, ..., 0, 0], [0, 0, ..., 0,
我已经从多个源 hdf5 文件构建了一个巨大的 dask 数组。 假设数据仅来自一个 hdf5 文件: import dask.array as da import h5py import xarra
关注 How to add vectors to the columns of some array in Julia? ,我想对 DataArrays 进行一些类似的说明。 让 y=randn(10
我是一名优秀的程序员,十分优秀!