2017-05-01 1 views
1

qui suit est une version simplifiée d'un ensemble de données que j'ai:Slicing et réindexation ensemble de données multidimensionnelle

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

Ce que j'essaie de faire, est de créer une trame de données de pandas géants de de la 1ère «des variables et « 2 », filtré uniquement selon le mode == 1, et toutes les données sont alignées vers la gauche (c.-à-d. les deux colonnes de la trame de données commencent à l'index 0 et la colonne la plus courte aura quelques valeurs NaN à la fin).

ici est mon pas prendre un tel succès sur elle:

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() 

je pouvais effacer les données obtenues en pandas géants, mais mes données réelles est beaucoup plus grande et je suis à la recherche d'un découpage pratique et Réindexation fait dans xarray.

Merci d'avance pour l'aide.

Edit: Eh bien, si vous regardez mon message original - je construisais le 'test' dataframe qui contient:

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 

Ce que je suis à la recherche est quelque chose comme après:

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 

que je suis arrivé en nettoyant manuellement le Nans comme ceci:

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

Mais Puisque mes données réelles sont assez grandes, je cherche une manière élégante de faire ceci using la bibliothèque de xarray (autrement je peux travailler avec de multiples dataframes de pandas manuellement ...)

+0

Vous pouvez effectuer toutes vos manipulations par variable dans xarra y à la place des pandas en utilisant les méthodes 'reset_index()' et 'dropna()' similaires. Mais je ne peux pas penser à un moyen d'éviter la boucle sur les variables comme vous le faites avec les pandas, parce que vous essayez de faire une opération qui supprime l'alignement de vos données, et ni xarray ni pandas ne sont conçus pour rendre cela facile. – shoyer

Répondre

1

Ce n'est pas immédiatement clair pour moi ce que vous ' re aller après (un exemple serait utile), mais je pense que cela est assez proche:

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 

Si vous ne l'aimez pas les lignes vides, vous pouvez utiliser .dropna() et/ou dans .reset_index() xarray ou pandas géants:

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

J'ai édité mon premier post avec un exemple de ce que je cherche –