我在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中对此结构建立索引)
答案 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