以下是我拥有的数据集的简化版本:
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'的熊猫数据框,仅根据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中完成的方便切片和重新索引。
先谢谢您的帮助。
编辑:
好吧,如果您看一下我的原始文章-我构建了包含以下内容的“测试”数据框:
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库进行此操作的优雅方法(否则,我可以手动处理多个熊猫数据框...)
最佳答案
目前尚不清楚您要做什么(一个例子会有所帮助),但是我认为这非常接近:
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
关于python - 切片和重新索引多维数据集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43720983/