从数据框中的日志创建共现表

时间:2013-12-03 18:34:21

标签: python pandas

我在pandas数据框中有一个使用日志:

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
...

有没有办法让dict形式具有上述内容,以便所有非零事件都不会代表任何给定对象'key'?

显然矩阵是三角形的。有没有办法将矩阵旋转到以下形式的熔融数据表中:

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 个答案:

答案 0 :(得分: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计数矩阵。得到你在那里的大部分时间。 (如果你愿意的话,你当然可以填写)

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]

答案 1 :(得分: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