2016-06-25 183 views
1

我有一個熊貓數據框,看起來像這樣從Python的熊貓數據框中添加了特定的概率:根據4元素列表索引

   Pr(X,O) 
(H, H, H, H) 0.042743 
(H, H, H, C) 0.003664 
(H, H, C, H) 0.073274 
(H, H, C, C) 0.021982 
(H, C, H, H) 0.005234 
(H, C, H, C) 0.000449 
(H, C, C, H) 0.031403 
(H, C, C, C) 0.009421 
(C, H, H, H) 0.113982 
(C, H, H, C) 0.009770 
(C, H, C, H) 0.195398 
(C, H, C, C) 0.058619 
(C, C, H, H) 0.048849 
(C, C, H, C) 0.004187 
(C, C, C, H) 0.293096 
(C, C, C, C) 0.087929 

很不幸,這是由代碼太大在此張貼產生題。請注意,我有兩個元素(HC)作爲DataFrame索引的四個序列的所有可能性。我的問題是,在每個職位上添加每個元素的所有數字的最佳方法是什麼?

例如。考慮位置0和元素H。在這裏,我會總結 0.042743 + 0.003664 + 0.073274 + 0.021982 + 0.005234 + 0.000449 + 0.031403 + 0.009421,等於0.1887。然後我想在C的相同位置再做所有的位置。 (很明顯,我可以拿補充,但我希望在未來再做一次這個兩個字母的字母)。

所期望的結果將是另一個大熊貓據幀這看起來是這樣的:

enter image description here

+0

是'(H,H,H,H)'元組還是串? – MaxU

+0

這是一個從'itertools.product'產生的元組。不知道大熊貓是否將它轉換爲字符串? – CiaranWelsh

回答

5

我試圖用一個多指標採取的itertools.product結果做到這一點。

index = pd.MultiIndex.from_tuples(itertools.product(('H', 'C'), repeat=4)) 

然後,我們groupby由不同層次,並連接它們。

pd.concat([df.groupby(level=[i]).sum().rename(columns={'Pr(X,O)': i}) for i in range(4)] , axis=1) 

     0   1   2   3 
C 0.81183 0.480568 0.771122 0.196021 
H 0.18817 0.519432 0.228878 0.803979 

編輯
由於MaxU的評論,沒有必要採取多指標與指數作爲一個系列一個小操作。

+2

這是一個美麗的解決方案!這裏是你的解決方案,它也應該與OP的原始索引一起工作:'pd.concat([x.groupby(x.index.str [i])。sum()。rename(columns = {'Pr(X,O )':i})我在範圍內(len(x.index [0]))]],axis = 1)' – MaxU

+2

這兩個奇妙的答案,非常優雅。謝謝 – CiaranWelsh

+1

謝謝!我們看到大熊貓不是真正的pythonic,因爲有時候有一千種方法可以做同樣的事情^^ – Jacquot

1

您可以從tuplesaggfunc=sum首先創建新列,然後melt和最後pivot_table

df['a'],df['b'],df['c'],df['d'] = zip(*df.index) 

print (df) 
       Pr(X,O) a b c d 
(H, H, H, H) 0.042743 H H H H 
(H, H, H, C) 0.003664 H H H C 
(H, H, C, H) 0.073274 H H C H 
(H, H, C, C) 0.021982 H H C C 
(H, C, H, H) 0.005234 H C H H 
(H, C, H, C) 0.000449 H C H C 
(H, C, C, H) 0.031403 H C C H 
(H, C, C, C) 0.009421 H C C C 
(C, H, H, H) 0.113982 C H H H 
(C, H, H, C) 0.009770 C H H C 
(C, H, C, H) 0.195398 C H C H 
(C, H, C, C) 0.058619 C H C C 
(C, C, H, H) 0.048849 C C H H 
(C, C, H, C) 0.004187 C C H C 
(C, C, C, H) 0.293096 C C C H 
(C, C, C, C) 0.087929 C C C C 

print (pd.melt(df, id_vars=['Pr(X,O)']) 
     .pivot_table(index='value', columns='variable', values='Pr(X,O)', aggfunc=sum)) 

variable  a   b   c   d 
value           
C   0.81183 0.480568 0.771122 0.196021 
H   0.18817 0.519432 0.228878 0.803979 

或者如果需要列名稱爲int並刪除索引和列名稱,請使用rename_axis(新的pandas0.18.0):

print (pd.melt(df, id_vars=['Pr(X,O)']) 
     .pivot_table(index='value', columns='variable', values='Pr(X,O)', aggfunc=sum) 
     .rename_axis(None) 
     .rename_axis(None, axis=1)) 

     0   1   2   3 
C 0.81183 0.480568 0.771122 0.196021 
H 0.18817 0.519432 0.228878 0.803979