2016-04-08 31 views
1

Ben pandalar için yeni ve multiindex matematik kavramak çalışıyorum ...Hiyerarşik dizine sahip pandalar veri çerçevesindeki bir alt sütun nasıl eklenir (diğer sütunlara dayanır)?

en biz örnekte olduğu gibi, nasıl bir "alt ekleyebilir, 2D sütunlar ve 2D satırlarla bir pandalar dataframe var diyelim sütun "('ALPHA', 'gamma') hangi değerlerin (same d1, same d2, 'ALPHA', 'alpha') + (same d1, d2-1, 'BETA', 'alpha')'a eşit olduğunu, yani ('A',2,'ALPHA','gamma') 10 + 2 mi?

ridx = pd.MultiIndex.from_tuples([('A',1),('A',2),('A',3),('B',1),('B',2),('B',3),('C',1),('C',2),('C',3)], names=['d1', 'd2']) 
cidx = pd.MultiIndex.from_tuples([('ALPHA','alpha'),('ALPHA','beta'),('BETA','alpha'),('BETA','beta')], names=['d3', 'd4']) 
dfmix = pd.DataFrame([(0,1,2,3),(10,11,12,13),(20,21,22,23), 
         (30,31,32,33),(40,41,42,43),(50,51,52,53), 
         (60,61,62,63),(70,71,72,73),(80,81,82,83),      
        ], index=ridx, columns=cidx) 
dfmix 

dataframe

cevap

2

bir liner:

dfmix['ALPHA','gamma'] = dfmix['ALPHA','alpha'] 
         + dfmix.groupby(level='d1').shift()['BETA','alpha'] 

pd.shift, istediğiniz gibi sıraları hizalamak için iyi bir araçtır. pd.groupby , bu işlemi uygulamadan önce satırları gruplamak içindir. matematik formülü hiçbir anlamı varsa Tabii

In [6]: dfmix.sort_index(axis=1) 
Out[6]: 
d3 ALPHA   BETA  
d4 alpha beta gamma alpha beta 
d1 d2        
A 1  0 1 NaN  2 3 
    2  10 11 12 12 13 
    3  20 21 32 22 23 
B 1  30 31 NaN 32 33 
    2  40 41 72 42 43 
    3  50 51 92 52 53 
C 1  60 61 NaN 62 63 
    2  70 71 132 72 73 
    3  80 81 152 82 83 

için

, sen Nan değerleri vardır.

+0

teşekkürler, istediğimi yapıyor. Ama formülünüzde neden bir grup olduğunu açıklayabilir misiniz? – Antonello

+0

tamam, anladım .. groupby() olmadan, shift() sadece tüm tablo aşağı kaydırdı, biz her seviye 1 grup için vardiya vardiyaya ihtiyacımız var .. tekrar teşekkürler .. – Antonello

1

daha iyi anlamak için yardımcı olacaktır ardından dfmix.columns[0..n]

tarafından her benzersiz sütun erişebilir:

In [129]: dfmix.columns[0] 
Out[129]: ('ALPHA', 'alpha') 

In [134]: dfmix[dfmix.columns[0]][1] 
Out[134]: 10 

In [136]: dfmix.columns[2] 
Out[136]: ('BETA', 'alpha') 

In [137]: dfmix[dfmix.columns[2]][0] 
Out[137]: 2 

In [138]: dfmix[dfmix.columns[0]][1] + dfmix[dfmix.columns[2]][0] 
Out[138]: 12 
+0

Cevabınız için çok teşekkür ederim .. bu yüzden dfmix [('ALPHA', 'gamma')] = dfmix [('ALPHA', 'alpha')] + dfmix [(' BETA ',' alpha ')], ama satırın mutlak sırasını bilmeden farklı satırları içeren işlemleri nasıl yapabilirim? Ben indeks almak için dfmix [('ALPHA', 'gamma')] 'üzerinde döngü yapmaya çalıştım, böylece hücre tarafından atama hücresini uygulayabileyim (yine de döngü olmadan bunu yapmak için bir yol tercih ederim), ancak döngü dfmix [('ALPHA', 'gamma')] 'sadece umduğum gibi (indeksi, değeri değil) hücre değerini döndürür ... – Antonello

+0

DataFrame çoklu dizine eklenmemişse satırları nasıl seçersiniz? – Abbas