2016-07-19 3 views
2

제목에서 알 수 있듯이 일부 조건에서 데이터 프레임의 각 열 쌍에 대해 함수를 적용하려고합니다. 나는 이것을 설명하려고 노력할 것이다. 내 df 형식은 다음과 같습니다.팬더 : 제약 조건 아래 각 열 쌍 위에 함수 적용

Code | 14 | 17 | 19 | ... 
w1 | 0 | 5 | 3 | ... 
w2 | 2 | 5 | 4 | ... 
w3 | 0 | 0 | 5 | ... 

코드는 직사각형 격자의 결정된 위치에 해당하며 ws는 다른 단어입니다. 두 쌍의 열 중 하나의 항목 합계가 5 인 경우 각 열 쌍 사이의 코사인 유사도 측정을 (EDITED!)으로 적용하고 싶습니다.

 | [14,17] | [14,19] | [14,...] | [17,19] | ... 
Sim |cs(14,17) |cs(14,19) |cs(14,...) |cs(17,19)..| ... 

CS 컬럼들의 각 쌍에 대한 코사인 유사도의 결과이다 :

원하는 출력은 무엇인가 될 것이다. 적절한 방법이 있습니까?

어떤 도움

는 입력이 컬렉션에서 각 쌍 메트릭 코사인을 적용하려면

+0

시리즈 (14,17)'나'CS (14,19)'등을 산출 '14'열은 5보다 큽니다. 당신은 아무것도 시도하지 않았습니까? 실패한 코드와 예제를 제공해 주시겠습니까? – danielhadar

+0

안녕하세요, @ 다니엘합니다. 사실 지금까지 나는 계산을 거의하지 않았다. 나는 함수에 적용 할 수있는 방법 (이 경우에는 코사인 유사성을 적용하지만 더 많은 함수를 적용 할 수있는 방법)이 벡터의 방식으로 각 열 쌍에 적용되는지, 즉 열에 루프를 작성하지 않는지 묻습니다. 마지막 df의 빌드는 결과를 더 잘 시각화하는 것이지만 중요하지는 않습니다. –

답변

3

:-) 주시면 감사하겠습니다, 당신은 scipy.spatial.distance.cdist을 사용할 수 있습니다. 이것은 double Python 루프를 사용하여 보다 훨씬 더 빠릅니다.

하나의 컬렉션을 df의 모든 열이라고합시다. 값이 싸서 할 수

import scipy.spatial.distance as SSD 
values = SSD.cdist(df2.T, df.T, metric='cosine') 
# array([[ 2.92893219e-01, 1.11022302e-16, 3.00000000e-01], 
#  [ 4.34314575e-01, 3.00000000e-01, 1.11022302e-16]]) 

:

모든 코사인 유사성이 하나의 호출로 계산 될 수있다
import pandas as pd 
df = pd.DataFrame({'14':[0,2,0], '17':[5,5,0], '19':[3,4,5]}) 
mask = df.sum(axis=0) > 5 
df2 = df.loc[:, mask] 

cdist에 : 합이 큰 5보다 여기서 다른 컬렉션 만 열하자 새로운 DataFrame와 재편 :

result = pd.DataFrame(values, columns=df.columns, index=df2.columns) 
result = result.stack() 

import pandas as pd 
import scipy.spatial.distance as SSD 
df = pd.DataFrame({'14':[0,2,0], '17':[5,5,0], '19':[3,4,5]}) 
mask = df.sum(axis=0) > 5 
df2 = df.loc[:, mask] 
values = SSD.cdist(df2.T, df.T, metric='cosine') 
result = pd.DataFrame(values, columns=df.columns, index=df2.columns) 
result = result.stack() 
mask = result.index.get_level_values(0) != result.index.get_level_values(1) 
result = result.loc[mask] 
print(result) 
어떤 항목이 거기 없기 때문에

은 내가 똑바로 받고 있어요 경우`CS를 원하지 않을 것이다

17 14 0.292893 
    19 0.300000 
19 14 0.434315 
    17 0.300000