2013-11-20 27 views
6

Zaman serisi veri çerçevem ​​var ve bunu Denemeler ve Ölçümler ile yeniden dizinlemek istiyorum. Bu dönüştürmek istediğinizPandaların veri tabanı çokdizli alt düzeyine sahip

   value 
Trial   
    1  0  13 
      1   3 
      2   4 
    2  3  NaN 
      4  12 
    3  5  34 

:

    value 
Trial  
    1  0  13 
      1   3 
      2   4 
    2  0  NaN 
      1  12 
    3  0  34 

nasıl iyi bunu yapabilirim

Basitleştirilmiş, bu var?

cevap

7

Sadece dün, şahane Andy Hayden, bu özelliği pandaların 0.13 sürümüne ekledi. Dokümanlara eklediği kullanım örneği için bkz. here.

Eğer pandaların geliştirme versiyonunu kaynaktan kurmayı rahatlatıyorsanız, şimdi kullanabilirsiniz.

df['Measurements'] = df.reset_index().groupby('Trial').cumcount() 

Aşağıdaki kod daha az özlü eğer eşdeğerdir ve pandalar herhangi yeni bir sürümü üzerinde çalışacak. Nihayet

grouped = df.reset_index().groupby('Trial') 
df['Measurements'] = grouped.apply(lambda x: Series(np.arange(len(x)), x.index)) 

, df.set_index(['Trial', 'Measurements'], inplace=True) istediğiniz sonucu almak için.

+4

haha! "şanlı" +1;) (Not: cumcount ayrıca dizin içinde dupes ile çalışır, ama "eşdeğer" yapmaz ... Ben doktorlarda biraz arsız ve "* aslında * eşdeğer" dedi: p) –

+0

eğer İndeksim çağrılmıyor ('ölçümler') - ancak daha önce hiç adı yok mu? – TheChymera

+1

Adsız dizin düzeyleri, '' level '' anahtar sözcüğü kullanılarak belirlenebilir, '' groupby (level = 1) ''. –