2013-12-03 55 views
1

我有一個使用日誌的熊貓數據幀:創建從日誌共現表在一個數據幀

event_time session_id  object 
10:00:03  1    A 
10:00:03  1    B 
10:00:03  1    C 
10:00:03  1    E 
10:00:03  2    J 
10:00:03  2    O 
10:00:03  2    A 
10:00:03  2    A 

我已經SESSION_ID分組的對象。我現在想要針對包含這些對象在一個組中共同出現的次數的任何給定對象對(每個單元格與對象構建一個對象的共現矩陣)(即針對相同的session_id):沿着以下幾行的內容:

A B  C ... 
A 20 1  12 
B 1 100  9 
C 12 9  30 
... 

有沒有一種方法可以在字典形式有上述所有非零事件不代表任何給定的對象'鍵'?

顯然,矩陣將是三角形的。有沒有辦法將矩陣轉換爲表格的熔化數據表:

Object 1 Object 2 # of co-occurences 
    A   A    20 
    A   B    1 
...   ...    ... 

在此先感謝您的幫助。

更新:我正在運行12MB數據的原型驗證算法,但會在c上的AMAZON上運行'for real'。來自多TB數據集的2-3 GB數據。我不認爲GB是相當豬的領土 - 更有效的建議回答更好

我希望能夠查找字典中的對象,然後看到與它們共同發生的所有對象和計數(可能最終索引Solr中該結構在未來)

回答

2

您可以使用pivot_table

In [11]: df.pivot_table('event_time', 'session_id', 'object', 
         aggfunc=len, fill_value=0) 
Out[11]: 
object  A B C E J O 
session_id     
1   1 1 1 1 0 0 
2   2 0 0 0 1 1 
+0

這看起來像是我可以用通過查看列建立一個聯合occurence表。我擔心的是,對於大數據集,0將成爲內存禁止(因爲矩陣將是稀疏的)。 – user7289

+0

不知道如何使用SparseDataFrame執行此操作(這裏的解決方案都不是稀疏的),也許將此作爲​​MultiIndex可能會更節省空間。 –

4

你輸入

In [80]: df 
Out[80]: 
    event_time session_id object 
0 10:00:03   1  A 
1 10:00:03   1  B 
2 10:00:03   1  C 
3 10:00:03   1  E 
4 10:00:03   2  J 
5 10:00:03   2  O 
6 10:00:03   2  A 
7 10:00:03   2  A 

[8 rows x 3 columns] 

這是SESSION_ID計數矩陣。在那裏獲取你的大部分。 (當然你也可以填補然後NAS如果你想)

In [81]: df.groupby('session_id').apply(lambda x: x['object'].value_counts()).unstack() 
Out[81]: 
      A B C E J O 
session_id      
1   1 1 1 1 NaN NaN 
2   2 NaN NaN NaN 1 1 

[2 rows x 6 columns]