группировка python и дальнейшая группировка

#python #python-3.x #pandas #pandas-groupby

#python #python-3.x #pandas #pandas-groupby

Вопрос:

Я пробовал разные способы группировать данные в двух разных столбцах и использовать яркий весовой коэффициент. К сожалению, я очень новичок в Python. Я рассмотрел несколько вопросов и попытался найти половину решения. Не могли бы вы, пожалуйста, помочь мне с оставшимся или, по крайней мере, предложить идею? ниже приведен макет кода:

     data = pd.DataFrame({'sku_id' : ['s1', 's1', 's1', 's2','s2','s2','s3','s3','s3'], 
             'product_id' : ['p1','p1','p2','p1','p1','p1','p2','p2','p3']})
count_series = data.groupby(['product_id','sku_id']).size()
print('-'*30)
print(count_series)
print('-'*30)
agg_count = count_series.to_frame(name = 'weight').reset_index()
print(agg_count)
print('-'*30)
  

Результат выглядит как:

 ------------------------------
product_id  sku_id
p1          s1        2
            s2        3
p2          s1        1
            s3        2
p3          s3        1
dtype: int64
------------------------------
  product_id sku_id  weight
0         p1     s1       2
1         p1     s2       3
2         p2     s1       1
3         p2     s3       2
4         p3     s3       1
------------------------------
  

Может кто-нибудь, пожалуйста, помочь мне дополнительно сгруппировать столбец SKU_ID на основе их комбинации и вхождений. (это что-то вроде механизма рекомендаций)

Желаемый результат:

 -----------------------
    sku_id    weight
    s1 amp; s2     1
    s2 amp; s3     0
    s3 amp; s1     1
-----------------------
  

Ответ №1:

IIUC, вы можете попробовать следующее:

 import itertools
#Replicating your steps:
m = data.groupby(['product_id','sku_id']).size().reset_index(name='weight')
#group on `product_id` and apply a `tuple on `sku_id` print to see results
n=m.groupby('product_id')['sku_id'].apply(tuple).reset_index()
#create combinations by list(itertools.combinations(m.sku_id.unique(),2))
#check if any combination matches tuple and apply astype(int) for int results
n['new']=n.sku_id.isin((itertools.combinations(m.sku_id.unique(),2))).astype(int)
print(n)

  product_id    sku_id  new
0         p1  (s1, s2)    1
1         p2  (s1, s3)    1
2         p3     (s3,)    0
  

Обратите внимание, что в s2 столбце присутствуют s3 и sku_id . Итак, рассмотрение только этой строки всегда даст вам комбинацию, поэтому мой вывод немного отличается.

Комментарии:

1. Это работает очень хорошо. Не могли бы вы, пожалуйста, помочь объяснить, что здесь используется.? пожалуйста, укажите кортеж и строку № (4).

2. @Ashwin я добавил объяснение в виде встроенных комментариев. 🙂 Надеюсь, это поможет.

3. спасибо, сэр. 🙂 большое спасибо. Сохраню этот пост для любых сомнений или помощи

4. Привет, Анки: У меня есть сомнения.! Новый столбец, который вы правильно сформировали? показывает ли это нам рекомендацию? (скажем, комбинация s1 и s2 появлялась 3 раза; комбинация s1 и s3 появлялась 10 раз) что-то в этомроде?