2013-12-03 26 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]