2017-01-23 4 views
2

У меня есть кадр данных с колонками ID, Product. Например,Найти наиболее часто встречающиеся в Dataframe списков

ID Product 
1 ['a','b'] 
2 ['a','b','e'] 
3 ['c','d'] 
4 ['a','b','c','d'] 

Продукт представляет собой поле списков, в котором каждый список содержит продукты, которыми располагает человек. Например, лицо с идентификатором 1 имеет продукты a и b. Мне нужно найти самые популярные/общие пары продуктов. В этом примере продукты [a, b] являются самыми популярными. Это должны быть наиболее распространенные пары продуктов, так как ни один человек не может иметь 1 продукт.

ответ

4

1) Используйте itertools.combinations, чтобы получить все такие комбинации пар и преобразовать результирующую серию в ее представление списка, которое позднее должно быть передано конструктору DataFrame.

2) Уложите DF и возьмите соответствующий Series.value_counts(). Захватите индекс с наивысшим счетчиком, используя Series.idxmax().


import itertools 

comb = lambda x: list(itertools.combinations(x, 2)) 
L = df['Product'].map(comb).tolist() 
pd.DataFrame(L).stack().value_counts(sort=False).idxmax() 
Out[21]: 
('a', 'b') 

Edit: (основано на комментарий о том новое требование)

a, cnt = np.unique(df.Product.values, return_counts=True) 
a[cnt==cnt.max()] 
array([['a', 'b', 'e']], dtype=object) 
+0

Мне нужно, чтобы она выглядела более 2 Продукты групп. Если набор данных изменится на это. 'ID продукта 1 [ 'а', 'б', 'е'] 2 [ 'а', 'б', 'е'] 3 [ 'с', 'd'] 4 [» a ',' b ',' c ',' d '] ' Он должен найти' [' a ',' b ',' e '] 'как самый популярный –

+0

Ну, о чем нигде не упоминалось в вашем сообщении , Вы все время подчеркивали слово «пары», поэтому я предположил, что вы группируетесь в соответствии с их попарными комбинациями и принимаете пару с максимальным счетом. Каким будет новый критерий? –

+0

Прошу прощения, это не должно быть попарно. В принципе, это должна быть только группа продуктов, выбранных большинством людей. Другими словами, это может быть 3,4,5 и т. Д. –

Смежные вопросы