2016-06-25 5 views
1

4 요소리스트 인덱스를 기반으로 파이썬의 팬더 DataFrame에서 특정 확률을 추가 :내가이처럼 보이는 팬더 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 

불행하게도이이에 게시 너무 커서 코드에 의해 생성 된 문제. 두 요소 (HC)가 DataFrame 인덱스로 4 개의 순서로 모두 포함될 수 있습니다. 내 질문은, 각 위치의 각 요소에 모든 숫자를 더하는 가장 좋은 방법은 무엇입니까?

예를 들면. 위치는 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

나는 MultiIndex로 itertools.product의 결과를 가지고 함께 할 것을 시도했다.

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

다음으로 서로 다른 레벨로 그룹화 한 다음 연결합니다.

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의 의견, 일련의 인덱스에 약간의 조작으로 MultiIndex를 취할 필요가 없습니다에
감사합니다.

+2

그것은 아름다운 해결책입니다! 당신의 솔루션은 OP의 원래 인덱스와 함께 작동해야합니다 :'pd.concat ([x.index.str [i]). sum(). rename (columns = { 'Pr (X, O)) ': i}) in range (len (x.index [0])], 축 = 1)' – MaxU

+2

환상적인 답은 매우 우아합니다. 감사합니다 – CiaranWelsh

+1

고마워요! 우리는 판다가 실제로 pythonic가 아님을 볼 수 있는데, 때로는 같은 일을하는 수천 가지 방법이 있기 때문입니다 ^^ – Jacquot

1

먼저 aggfunc=sum으로 다음 melt 마지막 pivot_table, tuples에서 새 열을 만들 수 있습니다 :

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 

소망의 결과는 다음과 같이 보이는 다른 팬더 DataFrame 것

또는 열 이름이 int 인 경우 색인 및 열 이름을 제거하려면 rename_axis (새) 0.18.0pandas에 :

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 
관련 문제