2016-06-25 4 views
1

4要素のリストインデックスに基づいて、PythonのパンダDATAFRAMEから特定の確率をアップ追加:は、私はこのようになりますパンダのデータフレームを持って

   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 

残念ながら、これはこの中投稿には大きすぎるのコードによって生成されました質問。 2つの要素(HおよびC)のすべての可能性が、DataFrameインデックスとして4つのシーケンスで示されていることに注意してください。私の質問は、各ポジションの各要素にすべての数値を加算する最良の方法は何ですか?

たとえば、位置0と要素Hを考えてください。ここでは、 0.042743 + 0.003664 + 0.073274 + 0.021982 + 0.005234 + 0.000449 + 0.031403 + 0.009421の合計が0.1887になります。私はそれから、同じ位置で再びCについて同じことをしたいと思います。 (明らかに私は補完を取ることができましたが、私はこれを2文字のアルファベットで将来もやり直したいと思います)。

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)) 

次に、異なるレベルでグループ化し、それらを連結します。 MaxUさんのコメントに

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 

EDIT
おかげで、シリーズとしてのインデックスにはほとんどの操作でマルチインデックスを取る必要はありません。

+2

それは美しい解決策です! OPの元のインデックスでも動作するソリューションがあります: 'pd.concat([x.index.str [i])。sum()。rename(columns = {'Pr(X、O) ) ':i})in range(len(x.index [0])]、axis = 1) ' – MaxU

+2

どちらも素晴らしい答えです。ありがとうございました – CiaranWelsh

+1

ありがとう!私たちは、パンダは本当にpythonicではないことが分かります。時には同じことをするための何千もの方法があるので、^^ – Jacquot

1

あなたが最初aggfunc=sumで、その後meltと最後pivot_tabletuplesから新しい列を作成することができます:

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_axispandas0.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 
関連する問題