2012-06-14 13 views
9

Çok sayıda farklı meteorolojik tanılama verisiyle uğraşmak için mükemmel pandas paketini kullanıyorum ve verileri birlikte dikerken boyutlardan hızla çıkıyorum. Belgelere bakarak, MultiIndex kullanmak benim sorunumu çözebilir, ancak durumumu nasıl uygulayacağımı bilmiyorum - belgeler rastgele verilerle MultiIndexes oluşturma örneklerini ve DataFrame s dizilerini gösterir. zamanlama verileri.Pandalar veri gruplandırmamı 3'ten fazla boyuta nasıl genelleştirebilirim?

Arka Plan

kullanıyorum temel veri yapısı, iki ana alanları içerir:

  • metadata, sayılardır açıklayan önemli değer çiftleri oluşan bir sözlüğü
  • Sayıları kendileri içeren bir pandalar veri yapısı olan data. Temel yapı data girdi olarak bir pandalar Series nesne vardır, böylece

en düşük ortak payda, timeseries veridir ve metadata alan bu numaralar aslında üzerinde 10 metrelik rüzgar için (örneğin vektör RMS hatası ne anlatır Doğu Pasifik'i deneyden 24 saat tahmini için Test1).

En düşük ortak paydayı alıp çeşitli zaman dilimlerini birbirine yapıştırıp sonuçları daha kullanışlı hale getirmek ve kolay kombinasyonlar sağlamak için arıyorum. Örneğin, tüm farklı teslim sürelerine bakmak isteyebilirim - teslim süresi için (örn. Deneme, bölge, vb.) Hariç aynı meta veri girişlerini paylaşan zaman çizelgeleri alacağım bir filtre rutinim var ve metadata alanının yalnızca ortak girdilerden oluştuğu nesne (Lead Time kaldırıldı) ve şimdi data alanı DataFrame pandalarıdır ve Lead Time değeri tarafından verilen sütun etiketleridir. Bunu tekrar uzatabilir ve sonuçta ortaya çıkan kareleri ve onları grubunu Panel pandaları vermek için sadece başka bir girişle (örneğin Experiment) birlikte almak istediğimi söyleyebilirim. öğe dizininin Experiment meta veri değerlerinin oluşturucu çerçevelerinden verildiği girişimde ve nesnenin yeni meta verileri Lead Time veya Experiment içermiyor.

I bu kompozit nesne yineleme, ben değişen teslim süresi ile çerçeveden bir boyut (yani, dizi damla olarak uygun meta/veri eşleştirme yeniden panel için bir çerçeve için iterseries rutin ve iterframes rutin sütunların üst kısmında, ve numaralı tüm meta veriler, sütun etiketinden alınan değerle geri yüklenen Lead Time alanı olacaktır. Bu harika çalışıyor. Her şey içinde hizalanmış bir kez

Ben boyutlar kalmadı

Sorun (en fazla 3 boyutlu bir Panellilerde) ve ben de boş sütunları kaldırmak için dropna gibi şeyler kullanmak mümkün değilim Panel (bu, özet istatistikleri çizerken birkaç hataya yol açmıştır). Daha yüksek boyutlu verilerle pandaların kullanımı hakkında okuma, MultiIndex ve kullanımı hakkında okumaya yol açmıştır. Dokümantasyonda verilen örnekleri denedim, ancak durumuma nasıl uygulanacağını hala belirsiz hâle getiriyorum. Herhangi bir yön yararlı olacaktır.Ben edebilmek istiyorum:

  • içine benim Series tabanlı veri birleştirin çok endeksli (bu harika olurdu boyutları keyfi bir sayı boyunca DataFrame - bu kareleri oluşturmak için bir arama ortadan kaldıracak series, ve sonra çerçevelerden çerçeveler oluşturmak için başka bir tane)
  • Oluşan çok endeksli DataFrame üzerinde yineleyin, tek bir boyut bırakarak bileşen meta verisini sıfırlayabilirim.

Düzen - Kod Örneği ekle

aşağıda Wes McKinney yanıtıdır ihtiyacım neredeyse tam olarak ne - konu benim DataFrame için birlikte çalışmak zorunda Serisi destekli depolama nesnelerden ilk çeviride olduğu Öğeleri gruplandırmaya başladığımda geri dönen nesneler. Data-Frame destekli sınıf, dizi tabanlı nesnelerin ve sütunlar arasında değişecek meta veri alanının bir listesini alan aşağıdaki yönteme sahiptir.

@classmethod 
def from_list(cls, results_list, column_key): 
    """ 
    Populate object from a list of results that all share the metadata except 
    for the field `column_key`. 

    """ 
    # Need two copies of the input results - one for building the object 
    # data and one for building the object metadata 
    for_data, for_metadata = itertools.tee(results_list) 

    self    = cls() 
    self.column_key = column_key 
    self.metadata = next(for_metadata).metadata.copy() 
    if column_key in self.metadata: 
     del self.metadata[column_key] 
    self.data = pandas.DataFrame(dict(((transform(r[column_key]), r.data) 
             for r in for_data))) 
    return self 

Bu rutin tarafından verilen çerçeve ulaştıktan sonra, kolayca uygula çeşitli işlemler aşağıda önerilen - Bu saklamak ihtiyacını ortadan kaldırır - özellikle programını ben çağrı concat zaman names alanını kullanmak mümkün ediliyor Bu sütun boyutunun adı, MultiIndex'te bu dizin boyutunun adı olarak depolandığından dahili olarak .

Aşağıdaki çözümü uygulayabilmeyi ve sıralı dizi destekli sınıflar ile anahtarların listesini almayı ve sıralı olarak gruplamayı yapabilmeyi istiyorum. Ancak, ben sütunları böylece, vaktinden temsil edecek bilmiyorum:

  • gerçekten 1-D DataFrame
  • ı don içinde Serisi verileri depolamak için bana mantıklı değil içinde bir MultiIndex oluşturmak için birlikte Seri DataFrames tutkal olarak keys bağımsız değişken ile birlikte pandas.concat kullanılarak önerebilir

cevap

9

gruplama> Çerçeve - 't dizin adını ve ilk serisi sütun ayarlamak için nasıl sütunlar:

In [20]: data 
Out[20]: 
{'a': 2012-04-16 0 
2012-04-17 1 
2012-04-18 2 
2012-04-19 3 
2012-04-20 4 
2012-04-21 5 
2012-04-22 6 
2012-04-23 7 
2012-04-24 8 
2012-04-25 9 
Freq: D, 
'b': 2012-04-16 0 
2012-04-17 1 
2012-04-18 2 
2012-04-19 3 
2012-04-20 4 
2012-04-21 5 
2012-04-22 6 
2012-04-23 7 
2012-04-24 8 
2012-04-25 9 
Freq: D, 
'c': 2012-04-16 0 
2012-04-17 1 
2012-04-18 2 
2012-04-19 3 
2012-04-20 4 
2012-04-21 5 
2012-04-22 6 
2012-04-23 7 
2012-04-24 8 
2012-04-25 9 
Freq: D} 

In [21]: df = pd.concat(data, axis=1, keys=['a', 'b', 'c']) 

In [22]: df 
Out[22]: 
      a b c 
2012-04-16 0 0 0 
2012-04-17 1 1 1 
2012-04-18 2 2 2 
2012-04-19 3 3 3 
2012-04-20 4 4 4 
2012-04-21 5 5 5 
2012-04-22 6 6 6 
2012-04-23 7 7 7 
2012-04-24 8 8 8 
2012-04-25 9 9 9 

In [23]: df2 = pd.concat([df, df], axis=1, keys=['group1', 'group2']) 

In [24]: df2 
Out[24]: 
      group1  group2  
       a b c  a b c 
2012-04-16  0 0 0  0 0 0 
2012-04-17  1 1 1  1 1 1 
2012-04-18  2 2 2  2 2 2 
2012-04-19  3 3 3  3 3 3 
2012-04-20  4 4 4  4 4 4 
2012-04-21  5 5 5  5 5 5 
2012-04-22  6 6 6  6 6 6 
2012-04-23  7 7 7  7 7 7 
2012-04-24  8 8 8  8 8 8 
2012-04-25  9 9 9  9 9 9 

Ardından vardır:

In [25]: df2['group2'] 
Out[25]: 
      a b c 
2012-04-16 0 0 0 
2012-04-17 1 1 1 
2012-04-18 2 2 2 
2012-04-19 3 3 3 
2012-04-20 4 4 4 
2012-04-21 5 5 5 
2012-04-22 6 6 6 
2012-04-23 7 7 7 
2012-04-24 8 8 8 
2012-04-25 9 9 9 

hatta

In [27]: df2.xs('b', axis=1, level=1) 
Out[27]: 
      group1 group2 
2012-04-16  0  0 
2012-04-17  1  1 
2012-04-18  2  2 
2012-04-19  3  3 
2012-04-20  4  4 
2012-04-21  5  5 
2012-04-22  6  6 
2012-04-23  7  7 
2012-04-24  8  8 
2012-04-25  9  9 

Sen keyfi olarak birçok seviyeleri olabilir:

In [29]: pd.concat([df2, df2], axis=1, keys=['tier1', 'tier2']) 
Out[29]: 
      tier1      tier2      
      group1  group2  group1  group2  
       a b c  a b c  a b c  a b c 
2012-04-16  0 0 0  0 0 0  0 0 0  0 0 0 
2012-04-17  1 1 1  1 1 1  1 1 1  1 1 1 
2012-04-18  2 2 2  2 2 2  2 2 2  2 2 2 
2012-04-19  3 3 3  3 3 3  3 3 3  3 3 3 
2012-04-20  4 4 4  4 4 4  4 4 4  4 4 4 
2012-04-21  5 5 5  5 5 5  5 5 5  5 5 5 
2012-04-22  6 6 6  6 6 6  6 6 6  6 6 6 
2012-04-23  7 7 7  7 7 7  7 7 7  7 7 7 
2012-04-24  8 8 8  8 8 8  8 8 8  8 8 8 
2012-04-25  9 9 9  9 9 9  9 9 9  9 9 9 
+0

Güzel! Bu benim ihtiyacım olan şey gibi görünüyor - şimdi onu denemek ve görmek için. –

+0

Sonunda tam olarak N boyutlu bir nesneye sahip olmayı planlıyorum, ancak bir çok durumda kesinlikle gerekli olmadı –

+0

Tamam - Ben her şeyi takip et ama ilk adımı (yani ilk DataFrame'e sahip olduğumda aldım)). Bu, bazı temel birleştirme yöntemini kullanarak Seri nesneler listemi (temel veri yapılarında) almam ve bir DataFrame oluşturmam gerekecek ve sonra bir dizi bitiştirme serisini yapmam gerekecek mi yoksa daha iyi bir yol var mı? ? –

İlgili konular