2013-12-03 1 views
1

У меня есть журнал использование в кадре панды данных:Создание таблицы смежности из бревна в dataframe

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

Заранее спасибо за любую помощь.

UPDATE: Я запускаю algos для прототипирования на 12MB данных, но будет запускать «для реального» на AMAZON на c. 2-3 ГБ данных из набора данных с несколькими ТБ. Я не думаю, что 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

Это похоже на то, я мог бы использовать, чтобы построить таблицу совместно встречаемости, глядя на колоннах. Мой страх в том, что с большими наборами данных 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 рассчитывает матрицу. Получите, вы больше всего там. (Конечно, Вы можете заполнить то НСБУ, если вы хотите)

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] 
Смежные вопросы