2014-03-04 68 views
0

我對python完全陌生,而且我的大部分工作都是在R中完成的。我想知道如何在python中使用這個問題。請參閱鏈接以清楚地瞭解問題和解決方案R代碼。 How to calculate a table of pairwise counts from long-form data framePython中成對頻率計數表

這是數據集:

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

下面是在Pandas中使用類似於R的DataFrame的一種方法。我假設您有一個包含數據的DataFrame df。 (您可以使用pandas.read_table從文件中讀取數據,請參閱:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_table.html)。

首先,使用groupbyid對列進行分組。

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

這可以使用字典設置並使用集合和計數器來進行分析。但是,我將使用最簡單的字典和循環方法展示分析。當然,實際的代碼可以變得更小,我故意展示擴展版本。我的Python沒有可用的熊貓,所以我使用最基本的Python。

# 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] 

現在,這使標籤與計數,您可以通過遍歷最終字典,適當地打印鍵和計數格式化輸出。