2013-04-18 32 views
23

Çok dizinli bir sütun veri çerçevesinin ikinci düzeyine bir sütun eklemek istiyorum.Pandalar: bir çok dizinli sütun veri karesine bir sütun ekleyin

In [151]: df 
Out[151]: 
first  bar     baz   
second  one  two  one  two 
A  0.487880 -0.487661 -1.030176 0.100813 
B  0.267913 1.918923 0.132791 0.178503 
C  1.550526 -0.312235 -1.177689 -0.081596 

doğrudan atama olağan hüner çalışmaz:

In [152]: df['bar']['three'] = [0, 1, 2] 

In [153]: df 
Out[153]: 
first  bar     baz   
second  one  two  one  two 
A  0.487880 -0.487661 -1.030176 0.100813 
B  0.267913 1.918923 0.132791 0.178503 
C  1.550526 -0.312235 -1.177689 -0.081596 

nasıl "bar" altında üçüncü satır ekleyebilir? Aslında oldukça basit oluyor

cevap

40

(FWIW, ben aslen düşünce Tam istediğiniz şekilde yapmak için):

df['bar', 'three'] = [0, 1, 2] 
df = df.sort_index(axis=1) 
print(df) 

     bar      baz   
     one  two three  one  two 
A -0.212901 0.503615  0 -1.660945 0.446778 
B -0.803926 -0.417570  1 -0.336827 0.989343 
C 3.400885 -0.214245  2 0.895745 1.011671 
+0

teşekkür: Üç "alt sütunları" ile çok düzeyli sütun ekleyerek. Yeni sütunun neden sadece sort_index kullandıktan sonra ortaya çıktığını açıkça belirtmemeliyim. – ezbentley

+2

Üzgünüm, cevabın bir parçası değil, sadece seçici davranıyorum. Aslında df ['bar', 'three'] = [0, 1, 2] 'dediğinizde hemen görünecektir. Varsayılan olarak pandalar onu DataFrame'in sonuna yerleştirir ([baz, two] 'dan sonra). Ben sadece diğer 'bar's ile görmek istedim. – spencerlyon2

+0

Anladım. Açıklama için teşekkürler. – ezbentley

1

biz çok düzeyli sütun eklemek isterseniz:

Kaynak DF:

In [221]: df 
Out[221]: 
first  bar     baz 
second  one  two  one  two 
A  -1.089798 2.053026 0.470218 1.440740 
B  0.488875 0.428836 1.413451 -0.683677 
C  -0.243064 -0.069446 -0.911166 0.478370 

Seçenek 1: bölünme sonucu ilave yeni bir foo sütunu olarak bar/baz

In [222]: df = df.join(df[['bar']].div(df['baz']).rename(columns={'bar':'foo'})) 

In [223]: df 
Out[223]: 
first  bar     baz     foo 
second  one  two  one  two  one  two 
A  -1.089798 2.053026 0.470218 1.440740 -2.317647 1.424980 
B  0.488875 0.428836 1.413451 -0.683677 0.345873 -0.627250 
C  -0.243064 -0.069446 -0.911166 0.478370 0.266761 -0.145172 

Seçenek 2:

In [235]: df = df.join(pd.DataFrame(np.random.rand(3,3), 
    ...:       columns=pd.MultiIndex.from_product([['new'], ['one','two','three']]), 
    ...:        index=df.index)) 

In [236]: df 
Out[236]: 
first  bar     baz     new 
second  one  two  one  two  one  two  three 
A  -1.089798 2.053026 0.470218 1.440740 0.274291 0.636257 0.091048 
B  0.488875 0.428836 1.413451 -0.683677 0.668157 0.456931 0.227568 
C  -0.243064 -0.069446 -0.911166 0.478370 0.333824 0.363060 0.949672 
İlgili konular