Python 3.x 使用xarray基于列合并数据帧

Python 3.x 使用xarray基于列合并数据帧,python-3.x,pandas,python-xarray,Python 3.x,Pandas,Python Xarray,我有一个数据帧字典,其中每个字典键对应于样本名称,数据帧本身有一个“时间”列和一些测量列(温度、浓度等)。样本之间的时间列不一致(不同样本的开始和结束时间不同,尽管我认为开始和结束之间的所有时间点都是测量的/具有相同的dT) 我想将所有数据合并到一个xarray中,其中一个轴是时间,另一个轴是测量类型,第三个轴是样本名称。由于并非所有样本的所有时间都进行了测量,因此缺失的数据应替换为nan 我对xarray没有什么经验,但是做了一个简单的合并(从xarray的dict构造xarray),我不知道

我有一个数据帧字典,其中每个字典键对应于样本名称,数据帧本身有一个“时间”列和一些测量列(温度、浓度等)。样本之间的时间列不一致(不同样本的开始和结束时间不同,尽管我认为开始和结束之间的所有时间点都是测量的/具有相同的dT)

我想将所有数据合并到一个xarray中,其中一个轴是时间,另一个轴是测量类型,第三个轴是样本名称。由于并非所有样本的所有时间都进行了测量,因此缺失的数据应替换为nan

我对xarray没有什么经验,但是做了一个简单的合并(从xarray的dict构造xarray),我不知道如何将“时间”作为一个轴(相反,每个只是将所有样本连接起来,时间是其中一个数据列)

谢谢你的帮助

编辑:

下面是我用虚拟数据编写的代码

import pandas as pd
import xarray as xr

#make fake data
dfs = {'sample1':pd.DataFrame([[1,0,0],[2,0,0],[3,0,0]],columns = ["Time","ColA","ColB"]), 
    'sample2':pd.DataFrame([[2,1,1],[3,1,1],[4,1,1]],columns = ["Time","ColA","ColB"])}

#code I use for real data
xrs = {k: xr.DataArray(v) for k, v in dfs.items()}
merged = xr.Dataset(variables).to_array(dim="samples")

print(merged)
输出为:

<xarray.DataArray (samples: 2, dim_0: 3, dim_1: 3)>
array([[[1, 0, 0],
        [2, 0, 0],
        [3, 0, 0]],

       [[2, 1, 1],
        [3, 1, 1],
        [4, 1, 1]]], dtype=int64)
Coordinates:
  * dim_0    (dim_0) int64 0 1 2
  * dim_1    (dim_1) object 'Time' 'ColA' 'ColB'
  * samples  (samples) <U7 'sample1' 'sample2'

数组([[1,0,0],
[2, 0, 0],
[3, 0, 0]],
[[2, 1, 1],
[3, 1, 1],
[4,1,1]]],dtype=int64)
协调:
*尺寸0(尺寸0)int64 0 1 2
*dim_1(dim_1)对象“时间”“可乐”“可乐”

*samples(samples)Xarray支持以下两种基本格式:

  • 表示要转换为
    xarray.DataArray
    的2D矩阵的数据帧,其中
    索引
    已正确标记轴
  • 数据框表示扁平的“整齐数据”,其中
    索引中的多索引级别对应于结果上的所需轴,
    对应于
    xarray.Dataset中的所需变量
  • 您的格式与前者最接近,所以让我们试试。原来您所缺少的只是调用
    。set_index('Time')
    来指示该列应用于标记轴:

    In [23]: da = xr.Dataset({k: v.set_index('Time') for k, v in dfs.items()}).to_array(dim='samples')
    
    In [24]: da
    Out[24]:
    <xarray.DataArray (samples: 2, Time: 4, dim_1: 2)>
    array([[[  0.,   0.],
            [  0.,   0.],
            [  0.,   0.],
            [ nan,  nan]],
    
           [[ nan,  nan],
            [  1.,   1.],
            [  1.,   1.],
            [  1.,   1.]]])
    Coordinates:
      * Time     (Time) int64 1 2 3 4
      * dim_1    (dim_1) object 'ColA' 'ColB'
      * samples  (samples) <U7 'sample1' 'sample2'
    
    或者使用数据帧,您可以使用
    pd.melt
    将广泛的数据“融化”为长而整齐的形式,例如

    In [26]: melted = pd.melt(dfs['sample1'], id_vars=['Time'], var_name='Measurement')
    
    In [27]: melted
    Out[27]:
       Time Measurement  value
    0     1        ColA      0
    1     2        ColA      0
    2     3        ColA      0
    3     1        ColB      0
    4     2        ColB      0
    5     3        ColB      0
    
    然后,从xarray转换只需设置一个多索引并调用
    。到\u xarray()

    [28]中的
    :熔化。将索引(['Time','Measurement'])设置为_xarray()
    出[28]:
    尺寸:(测量:2,时间:3)
    协调:
    *时间(Time)int64 1 2 3
    *度量(度量)对象“ColA”“ColB”
    数据变量:
    值(时间、测量值)int64 0 0
    
    你知道,在这个忙碌的世界里,数据科学界的人们没有耐心在没有样本数据的情况下进行大的解释。最好添加一个示例输入数据帧和预期输出良好,完成
    In [22]: da.to_series()
    Out[22]:
    samples  Time  dim_1
    sample1  1     ColA     0.0
                   ColB     0.0
             2     ColA     0.0
                   ColB     0.0
             3     ColA     0.0
                   ColB     0.0
             4     ColA     NaN
                   ColB     NaN
    sample2  1     ColA     NaN
                   ColB     NaN
             2     ColA     1.0
                   ColB     1.0
             3     ColA     1.0
                   ColB     1.0
             4     ColA     1.0
                   ColB     1.0
    dtype: float64
    
    In [26]: melted = pd.melt(dfs['sample1'], id_vars=['Time'], var_name='Measurement')
    
    In [27]: melted
    Out[27]:
       Time Measurement  value
    0     1        ColA      0
    1     2        ColA      0
    2     3        ColA      0
    3     1        ColB      0
    4     2        ColB      0
    5     3        ColB      0
    
    In [28]: melted.set_index(['Time', 'Measurement']).to_xarray()
    Out[28]:
    <xarray.Dataset>
    Dimensions:      (Measurement: 2, Time: 3)
    Coordinates:
      * Time         (Time) int64 1 2 3
      * Measurement  (Measurement) object 'ColA' 'ColB'
    Data variables:
        value        (Time, Measurement) int64 0 0 0 0 0 0