2013-11-03 15 views
2

我非常尷尬地問這個帖子中的問題,因爲我確定它是完全基本的。然而,我已經花了近兩年了數小時鑽研這些pandas文檔,並在陽光下亂投醫,無果......無法找到一個數據框彈出的方式

舉個例子,像這樣的一個數據幀:

 A B C D  x  y  z 
0 a0 b0 c0 d0 0.007 0.710 0.990 
1 a0 b0 c0 d1 0.283 0.040 1.027 
2 a0 b0 c1 d0 0.017 0.688 2.840 
3 a0 b0 c1 d1 0.167 0.132 2.471 
4 a0 b1 c0 d0 0.041 0.851 1.078 
5 a0 b1 c0 d1 0.235 1.027 1.027 
6 a0 b1 c1 d0 0.037 0.934 2.282 
7 a0 b1 c1 d1 0.023 1.049 2.826 
8 a1 b0 c0 d0 0.912 0.425 1.055 
9 a1 b0 c0 d1 0.329 0.932 0.836 
10 a1 b0 c1 d0 0.481 0.681 0.997 
11 a1 b0 c1 d1 0.782 0.595 2.294 
12 a1 b1 c0 d0 0.264 0.918 0.857 
13 a1 b1 c0 d1 0.053 1.001 0.920 
14 a1 b1 c1 d0 1.161 1.090 1.470 
15 a1 b1 c1 d1 0.130 0.992 2.121 

請注意,列AB,CD的列的不同值的每個組合在此數據幀中只出現一次。因此,可以將這一列的子集看作「關鍵列」,將其餘列作爲「值列」。

我想從這個產生一個新的框架,通過「抨擊」列C。我的意思是,對於其餘「關鍵列」(A,BD)的值的每個不同組合,C列的值在新幀中產生相應的「值列」。

例如,如果我們忽略列xy的那一刻,我上面提到的拆垛操作會產生數據幀:

A B D  c0  c1 
0 a0 b0 d0 0.990 2.840 
1 a0 b0 d1 1.027 2.471 
2 a0 b1 d0 1.078 2.282 
3 a0 b1 d1 1.027 2.826 
4 a1 b0 d0 1.055 0.997 
5 a1 b0 d1 0.836 2.294 
6 a1 b1 d0 0.857 1.470 
7 a1 b1 d1 0.920 2.121 

這裏新列c0c1的值是從獲得列z的值(在原始數據幀中),列ABD的值的對應唯一組合。

我該怎麼做?

它會是不錯的可以做一個類似的卸堆操作與原始幀(即一個與所有值列xyz),或者使用某種形式的分層列組織的新框架(即現在在哪裏列xy,並且z每個在於,反過來,「subcolums」 c0c1的),或者是一些方案來命名使用複合名稱的新列(例如,在新的框架柱xyz將被欄目列x_c0,x_c1y_c0y_c1z_c0,並z_c1,等等),但是這可能是希望太多...

PS:這裏有一個數據幀的數據上面,TSV格式:

A B  C  D  x  y  z 
a0 b0  c0  d0  0.007 0.71 0.99 
a0 b0  c0  d1  0.283 0.04 1.027 
a0 b0  c1  d0  0.017 0.688 2.84 
a0 b0  c1  d1  0.167 0.132 2.471 
a0 b1  c0  d0  0.041 0.851 1.078 
a0 b1  c0  d1  0.235 1.027 1.027 
a0 b1  c1  d0  0.037 0.934 2.282 
a0 b1  c1  d1  0.023 1.049 2.826 
a1 b0  c0  d0  0.912 0.425 1.055 
a1 b0  c0  d1  0.329 0.932 0.836 
a1 b0  c1  d0  0.481 0.681 0.997 
a1 b0  c1  d1  0.782 0.595 2.294 
a1 b1  c0  d0  0.264 0.918 0.857 
a1 b1  c0  d1  0.053 1.001 0.92 
a1 b1  c1  d0  1.161 1.09 1.47 
a1 b1  c1  d1  0.13 0.992 2.121 

更明確地說,數據幀是同構dict的鍵是4元組('a0', 'b0', 'c0', 'd0'), ('a0', 'b0', 'c0', 'd1'), ..., ('a1', 'b1', 'c1', 'd1'),並且其值是3元組(0.007, 0.710, 0.990), (0.283, 0.040, 1.027), ..., (0.130, 0.992, 2.121)。我嘗試過的很多事情之一是找到一種方法,通過「鍵列」的獨特組合來索引數據框。同樣的故事:這應該是「你好,世界」級的東西,在pandas,但我無法找到如何做到這一點的文件中。顯然,我的大腦和誰寫的pandas文檔是完全相互正交的大腦...

回答

2

它會是不錯的可以做一個類似的卸堆操作與 原始幀(即一個與所有值列的x,y和z), 或者使用在新 幀某種形式的分層列組織的(即,其中現在的列的x,y和z將分別由,反過來,「subcolums」的 c0和c1)

怎麼樣:

>>> df.pivot_table(values=["x","y","z"],rows=["A","B","D"], cols="C") 
       x    y    z  
C   c0  c1  c0  c1  c0  c1 
A B D           
a0 b0 d0 0.007 0.017 0.710 0.688 0.990 2.840 
     d1 0.283 0.167 0.040 0.132 1.027 2.471 
    b1 d0 0.041 0.037 0.851 0.934 1.078 2.282 
     d1 0.235 0.023 1.027 1.049 1.027 2.826 
a1 b0 d0 0.912 0.481 0.425 0.681 1.055 0.997 
     d1 0.329 0.782 0.932 0.595 0.836 2.294 
    b1 d0 0.264 1.161 0.918 1.090 0.857 1.470 
     d1 0.053 0.130 1.001 0.992 0.920 2.121 

請參閱here,並注意默認聚合函數爲mean。如果你知道你不會有一個以上的值去同一個小區一樣,這裏也沒有多大關係,但我曾經讓自己陷入到麻煩,因爲我認爲這是sum