#python #pandas #python-2.7 #dataframe
#python #pandas #python-2.7 #фрейм данных
Вопрос:
У меня есть словарь, который представляет набор продуктов. Мне нужно найти все повторяющиеся продукты в этих продуктах. Если продукты имеют одинаковые 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()
для этих данных:
Мне нужен этот результат — список возможных дубликатов продуктов для каждой возможной группы (возьмите только самые большие супергруппы):
Итак, например, давайте возьмем «рубашку» с id=1
у этого продукта нет цвета или размера, чтобы он мог появиться в возможной «группе дубликатов» вместе с рубашкой № 2 (которая имеет размер «s», но не имеет цвета) и рубашкой № 4 (которая имеет цвет «красный», но не имеет размера). Таким образом, эти три рубашки (1,2,4), возможно, являются дубликатами с одинаковым цветом «red» и размером «s».
Я попытался реализовать это, перебрав все возможные комбинации отсутствующих значений, но это кажется неправильным и сложным.
Есть ли способ получить желаемый результат?
Ответ №1:
Вы можете создать все возможные ключи, которые не являются 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}}
Doku: