Python Pandas считает наиболее частые случаи - PullRequest
0 голосов
/ 10 декабря 2018

Это мой примерный фрейм данных с данными о заказах:

import pandas as pd
my_dict = { 
     'status' : ["a", "b", "c", "d", "a","a", "d"],
     'city' : ["London","Berlin","Paris", "Berlin", "Boston", "Paris", "Boston"],
     'components': ["a01, a02, b01, b07, b08, с03, d07, e05, e06", 
                    "a01, b02, b35, b68, с43, d02, d07, e04, e05, e08", 
                    "a02, a05, b08, с03, d02, d06, e04, e05, e06", 
                    "a03, a26, a28, a53, b08, с03, d02, f01, f24", 
                    "a01, a28, a46, b37, с43, d06, e04, e05, f02", 
                    "a02, a05, b35, b68, с43, d02, d07, e04, e05, e08", 
                    "a02, a03, b08, b68, с43, d06, d07, e04, e05, e08"]
}
df = pd.DataFrame(my_dict)
df

enter image description here

Мне нужно посчитать чаще всего:

  1. Top-n совместно встречающихся компонентов в заказах
  2. Top-n наиболее часто встречающихся компонентов (независимо от совместного появления)

Что будет лучшим способом сделать это?

Я также вижу связь с проблемой анализа корзины, но не знаю, как это сделать.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вот еще несколько «панд» способов сделать то же самое:

Чтобы получить три верхних компонента

#Using list comprehension usually faster than .str accessor in pandas
pd.concat([pd.Series(i.split(',')) for i in df.components]).value_counts().head(3)
#OR using "pure" pandas methods
df.components.str.split(',', expand=True).stack().value_counts().head(3)

Вывод:

 e05    6
 e04    5
 d02    4
dtype: int64

Следующий поисккогорты, 3 компонента сообщаются вместе n = 3:

from itertools import combinations
n=3
pd.concat([pd.Series(list(combinations(i.split(','), n))) for i in df.components])\
  .value_counts().head(3)

Выход:

( с43,  e04,  e05)    4
(a02,  e04,  e05)     3
( с43,  d07,  e05)    3
dtype: int64
0 голосов
/ 10 декабря 2018

@ В ответе СкоттБостона показаны векторизованные (и, вероятно, более быстрые) способы достижения этого.

Топ встречается

from collections import Counter
from itertools import chain

n = 3
individual_components = chain.from_iterable(df['components'].str.split(', '))
counter = Counter(individual_components)
print(counter.most_common(n))
# [('e05', 6), ('e04', 5), ('a02', 4)]


Top-nсопутствующее

Обратите внимание, что я использую n дважды, один раз для "размера совместного вхождения" и один раз для части "top-n".Очевидно, что вы можете использовать 2 разные переменные.

from collections import Counter
from itertools import combinations

n = 3
individual_components = []
for components in df['components']:
    order_components = sorted(components.split(', '))
    individual_components.extend(combinations(order_components, n))
counter = Counter(individual_components)
print(counter.most_common(n))
# [(('e04', 'e05', 'с43'), 4), (('a02', 'b08', 'e05'), 3), (('a02', 'd07', 'e05'), 3)]
...