以下是我拥有的数据集的简化版本:
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数据帧...)
答案 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