切片和重新索引多维数据集

时间:2017-05-01 14:42:27

标签: python pandas python-xarray

以下是我拥有的数据集的简化版本:

import numpy as np
import pandas as pd
import xarray as xr

np.random.seed(123)

times = range(10)
a = np.array([0,0,0,0,0,0,0,1,1,1]).reshape(10,1)
b = np.array([0,1,1,1,1,0,0,0,0,0]).reshape(10,1)
val1 = np.random.randn(10,1)
val1 = np.append(val1,a,1)
val2 = np.random.randn(10,1)
val2 = np.append(val2,b,1)

ds = xr.Dataset({'1st': (('time', 'attr'), val1),
                 '2nd': (('time', 'attr'), val2)},
                {'time': times, 'attr': ['val', 'mode']})

我尝试做的是创建变量'1st'和'2nd'的pandas数据帧,仅根据mode == 1进行过滤,并将所有数据对齐到左边(即 - 两列的数据帧从索引0开始,较短的列在结尾处有一些NaN。)

这是我不那么成功的事情:

mask = ds.sel(attr='mode')==1
maskedds = ds.where(mask)
maskedds = maskedds.dropna('time',how='all')
maskedds = maskedds.reset_index('time',drop=True)
test = maskedds.sel(attr='val').to_dataframe()

我可以在熊猫中清除结果数据,但我的实际数据要大得多,我正在寻找在xarray中完成的方便切片和重建索引。

提前感谢您的帮助。

编辑: 好吧,如果你看看我原来的帖子 - 我构建了'test'数据框,其中包含:

attr       2nd       1st
time                         
0     val -0.094709       NaN
1     val  1.491390       NaN
2     val -0.638902       NaN
3     val -0.443982       NaN
4     val       NaN -0.428913
5     val       NaN  1.265936
6     val       NaN -0.866740

我正在照顾的是这样的事情:

attr       2nd       1st
time                         
0     val -0.094709 -0.428913
1     val  1.491390  1.265936
2     val -0.638902 -0.866740
3     val -0.443982       NaN
4     val       NaN       NaN
5     val       NaN       NaN
6     val       NaN       NaN

我通过手动清洁Nans得到了这样的结果:

nonan = test['1st'].dropna().reset_index(drop=True)
test['1st'] = nonan

但由于我的实际数据非常大,我正在寻找一种利用xarray库实现这一目标的优雅方式(否则我可以手动处理多个pandas数据帧...)

1 个答案:

答案 0 :(得分:1)

我不清楚你要追求的是什么(一个例子会有所帮助),但我认为这非常接近:

In [13]: ds.sel(attr='val').where(ds.sel(attr='mode')).to_dataframe()
Out[13]:
           1st       2nd
time
0          NaN       NaN
1          NaN -0.094709
2          NaN  1.491390
3          NaN -0.638902
4          NaN -0.443982
5          NaN       NaN
6          NaN       NaN
7    -0.428913       NaN
8     1.265936       NaN
9    -0.866740       NaN

如果您不喜欢空行,可以在xarray或pandas中使用.dropna()和/或.reset_index()

In [16]: ds.sel(attr='val').where(ds.sel(attr='mode')).dropna('time', how='all').to_dataframe()
Out[16]:
           1st       2nd
time
1          NaN -0.094709
2          NaN  1.491390
3          NaN -0.638902
4          NaN -0.443982
7    -0.428913       NaN
8     1.265936       NaN
9    -0.866740       NaN