2017-05-01 21 views
1

以下は、私が持っているデータセットの簡易版である:スライスと再インデックス多次元データセット

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']}) 

私がやろう何、変数「第一」と「第二」のパンダのデータフレームを作成することです、モード== 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 

を私は後に探しています何がこのようなものです私は手動で次のようにNaNを洗浄することにより得

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 

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

しかし、私の実際のデータはかなり大きいので、私はxarrayライブラリを利用してこれを行うエレガントな方法を探しています(そうでなければ、私は手動で複数のパンダのデータフレームを扱うことができます...)

+0

xarraで変数ごとの操作をすべて行うことができます同様の 'reset_index()'と 'dropna()'メソッドを使ってパンダの代わりにyを返します。しかし、あなたはあなたのデータからアラインメントを取り除く操作をしようとしているので、あなたがパンダと同じように変数をループすることを避ける方法は考えられません。また、xarrayやpandasもそう簡単にすることはできません。 – shoyer

答えて

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やパンダで.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 
+0

私が探しているものの例で私の最初の投稿を編集しました –