2014-03-04 1 views
0

저는 파이썬에 완전히 익숙하지 않았고, 대부분의 연구는 R에서 진행되었습니다. 파이썬에서이 질문을하는 방법을 알고 싶습니다. 질문과 솔루션 R 코드에 대한 명확한 이해를 위해서는 링크를 참조하십시오.파이썬에서의 쌍수 빈도 수 테이블

How to calculate a table of pairwise counts from long-form data frame 데이터 집합입니다 :

id featureCode 
5 PPLC 
5 PCLI 
6 PPLC 
6 PCLI 
7 PPL 
7 PPLC 
7 PCLI 
8 PPLC 
9 PPLC 
10 PPLC 

이 내가 원하는 무엇인가 :

 PPLC PCLI PPL 
PPLC 0  3  1 
PCLI 3  0  1 
PPL 1  1  0 

나는 각 기능 코드가 다른 기능을 사용하는 횟수를 계산하고 싶습니다 코드 (제목의 "페어 와이즈 카운트"). 이제 이것이 의미가 있기를 바랍니다. 이에 대한 도움을주십시오. 감사합니다 ...

+3

대답 할 수있는 방식으로 질문을 표현하십시오. – vish

+0

불편을 끼쳐 드려 죄송합니다. 나는 그것을 변경하려고하지만 내 질문 : http://stackoverflow.com/q/22152856/3371626 또한 이것을 기반으로합니다. – user3371626

+0

나는 이제 그 의미가되기를 바랍니다. – user3371626

답변

0

여기에 R과 비슷한 DataFrames를 사용하는 Pandas에서이 작업을 수행하는 한 가지 방법이 있습니다. 데이터가 포함 된 DataFrame df이 있다고 가정합니다. (pandas.read_table을 사용하여 파일에서 데이터를 읽을 수 있습니다. thid : http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_table.html 참조).

먼저 groupby을 사용하여 열을 id으로 그룹화하십시오.

gps = df.groupby("id") 
print gps.groups 
Out: {5: [0, 1], 6: [2, 3], 7: [4, 5, 6], 8: [7], 9: [8], 10: [9]} 

groups

는 동일한 ID에 속하는 행 번호를 제공한다.

다음으로 featureCode에 고유 한 값으로 행과 열 이름이있는 대상 행렬을 만듭니다.

unqFet = list(set(df["featureCode"])) 
final = pandas.DataFrame(columns=unqFet, index=unqFet) 
final = final.fillna(0) 
print final 
Out: 
      PCLI PPLC PPL 
    PCLI 0 0 0 
    PPLC 0 0 0 
    PPL  0 0 0 

마지막으로 그룹을 반복하고 final 행렬의 올바른 값을 증가 시키십시오.

for g in gps.groups.values(): 
    for i in range(len(g)): 
     for j in range(len(g)): 
      if i != j: 
       final[ df["featureCode"][g[i]] ][ df["featureCode"][g[j]] ] += 1 

print final 
Out: 
      PCLI PPLC PPL 
    PCLI 0 3 1 
    PPLC 3 0 1 
    PPL  1 1 0 
0

사전 설정 및 수집 및 카운터를 사용하여 분석을 수행 할 수 있습니다. 그러나 가장 간단한 사전 및 루프 방법을 사용하여 분석을 보여 드리겠습니다. 물론 실제 코드는 작게 만들 수 있습니다. 나는 의도적으로 확장 된 버전을 보여줍니다. 파이썬에는 팬더가 없기 때문에 가장 기본적인 파이썬을 사용하고 있습니다.

# Assume the you have a set of tuples lst 
lst.sort() # sort the list by id 
mydict = {} 
id = None 
tags = [] 
for ids in lst: 
    if ids[0] == id 
    # Pick up the current entry 
    tags.append(ids[1]) 
    else: 
    # This is a new id 
    # check the count of the previous tags. 
    for elem1 in tags: 
     for elem2 in tags: 
     if elem1 != elem2: 
      if elem1 not in mydict: 
      mydict[elem1] = {} 
      if elem2 not in mydict[elem1]: 
      mydict[elem1][elem2] = 0 
      mydict[elem1][elem2] += 1 
    # This is a different id, reset the indicators for the next loop 
    id = ids[0] 
    tags = ids[1]  # This is a new id 
else: 
    # The last element of the lst has to be processed as well 
    # check the count of the previous tags. 
    for elem1 in tags: 
    for elem2 in tags: 
     if elem1 != elem2: 
     if elem1 not in mydict: 
      mydict[elem1] = {} 
     if elem2 not in mydict[elem1]: 
      mydict[elem1][elem2] = 0 
     mydict[elem1][elem2] += 1 


# at this point, my dict has the full dictionary count 
for tag in mydict.keys(): 
    print tag, mydict[tag] 

이 이제 카운트에 태그를 부여하며, 사용자는, 최종 사전에 걸쳐 반복 적절히 키와 수를 인쇄하여 출력을 포맷 할 수 있습니다.