Пользовательская группировка для всех возможных групп при наличии пропущенных значений - PullRequest
1 голос
/ 19 марта 2019

У меня есть словарь, который представляет набор продуктов.Мне нужно найти все дубликаты продуктов в этих продуктах.Если продукты имеют одинаковые product_type, color и size ->, они являются дубликатами.Я мог бы легко сгруппировать ('product_type', 'color', 'size'), если бы у меня не было проблемы: некоторые значения отсутствуют.Теперь мне нужно найти все возможные группы товаров, которые могут быть дубликатами между собой. Это означает, что некоторые элементы могут появляться в нескольких группах.

Позвольте мне проиллюстрировать:

import pandas as pd


def main():
    data= {'product_id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
         'product_type': ['shirt', 'shirt', 'shirt', 'shirt', 'shirt', 'hat', 'hat', 'hat', 'hat', 'hat', 'hat', ],
         'color': [None, None, None, 'red', 'blue', None, 'blue', 'blue', 'blue', 'red', 'red', ],
                       'size': [None, 's', 'xl', None, None, 's', None, 's', 'xl', None, 'xl', ],
                       }
    print(data)

if __name__ == '__main__':
    main()

для этих данных:

enter image description here

Мне нужен этот результат - список возможных дубликатов продуктов для каждой возможной группы (возьмите только самые большие супергруппы):

![enter image description here

Так, например, давайте возьмем «рубашку» с id=1, у этого продукта нет цвета или размера, чтобы он мог появиться в возможной «группе дубликатов» вместе с рубашкой № 2 (которая имеет размер «s», ноне имеет цвета) и рубашка № 4 (которая имеет цвет «красный», но не имеет размера).Таким образом, эти три рубашки (1,2,4), возможно, являются дубликатами одного и того же цвета "красный" и размера "s".

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

Есть ли способ получить желаемый результат?

1 Ответ

0 голосов
/ 19 марта 2019

Вы можете создать все возможные ключи, которые не являются None, а затем проверить, какой элемент попадает в какой ключ - в соответствии с None s:

data= {'product_id'  : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
       'product_type': ['shirt', 'shirt', 'shirt', 'shirt', 'shirt', 'hat',
                        'hat', 'hat', 'hat', 'hat', 'hat', ],
       'color'       : [None, None, None, 'red', 'blue', None, 'blue', 
                        'blue', 'blue', 'red', 'red', ],
       'size'        : [None, 's', 'xl', None, None, 's', None, 's', 'xl', None, 'xl', ]}



from itertools import product

# create all keys without None in it     
p = product((t for t in set(data['product_type']) if t), 
            (c for c in set(data['color']) if c), 
            (s for s in set(data['size']) if s))

# create the things you have in stock
inventar = list( zip(data['product_id'],data['product_type'],data['color'],data['size']))
d = {}

# order things into its categories
for cat in p:
    d.setdefault(cat,set())  # uses a set to collect the IDs
    for item in inventar:
        TY, CO, SI = cat
        ID, TYPE, COLOR, SIZE = item

        # the (TYPE or TY) will substitute TY for any TYPE that is None etc.
        if (TYPE or TY)==TY and (COLOR or CO)==CO and (SIZE or SI)==SI:
            d[cat].add(ID)

print(d)

Выход:

# category-key            id's that match
{('shirt', 'blue', 's') : {1, 2, 5}, 
 ('shirt', 'blue', 'xl'): {1, 3, 5}, 
 ('shirt', 'red', 's')  : {1, 2, 4}, 
 ('shirt', 'red', 'xl') : {1, 3, 4}, 
 ('hat', 'blue', 's')   : {8, 6, 7}, 
 ('hat', 'blue', 'xl')  : {9, 7}, 
 ('hat', 'red', 's')    : {10, 6},
 ('hat', 'red', 'xl')   : {10, 11}}

Доку:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...