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

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/

10-12 13:57
查看更多