2014-01-28 7 views
4

팬더에서 카이 제곱 테스트를 수동으로 코딩하려고합니다. 아래 데이터 프레임에서 row 0row 1을 비교합니다.팬더 : 행과 열의 바깥 쪽

data 
     2  3  5  10  30 
0  3  0  6  5  0 
1 33324 15833 58305 54402 38920 

이렇게하려면 각 셀의 예상 세포 수를 다음과 같이 계산해야합니다. cell(i,j) = rowSum(i)*colSum(j)/sumAll. R, 나는 단순히 outer() 제품을 복용하여이 작업을 수행 할 수 있습니다 : 나는 위의 R 코드의 결과 모방 NumPy와의 외적 기능을 사용

Exp_counts <- outer(rowSums(data), colSums(data), "*")/sum(data) # Expected cell counts 

: 가능이를 달성하기 위해

import numpy as np 
pd.DataFrame(np.outer(data.sum(axis=1),data.sum(axis=0))/ (data.sum().sum()), index=data.index, columns=data.columns.values) 
     2  3  5  10  30 
0  2  1  4  3  2 
1 33324 15831 58306 54403 38917 

인가 팬더 기능?

+1

이 기능이 작동하지 않습니까? (now_a_df = pd.DataFrame (not_yet_df)) 'not_yet_df = np.outer (data.sum (축 = 0), data.sum (축 = 1))/(데이터. ' 게다가, 당신은'pd.np.outer (..) '로 원한다면 numpy를 import하지 않고 pandas에서'outer' 함수를 호출 할 수 있습니다. – mkln

+0

예, 그렇습니다 (그러나 축 순서는 합산하는 동안 뒤집혀 야한다는 것을 깨달았습니다.). 나는 질책하는 해결책을 포함하여 나의 질문에 다시 말을했다. 나는 팬더 (Pandas) 기능으로 이것을 수행 할 방법을 찾고있다. – Rhubarb

+0

왜 팬더 기능이 필요합니까? – mkln

답변

1

내장 된 방법만을 판다를 사용하는 완벽한 솔루션 :

def outer_product(row): 
    numerator = df.sum(1).mul(row.sum(0)) 
    denominator = df.sum(0).sum(0) 
    return (numerator.floordiv(denominator)) 

df.apply(outer_product) 

Image

타이밍 : DF 1 백만 행하십시오.

enter image description here