Сравнить значения словаря и вернуть количество совпадающих значений - PullRequest
0 голосов
/ 14 мая 2018

У меня есть словарь, состоящий из названий продуктов и уникальных электронных писем клиентов, которые приобрели эти элементы, которые выглядят так:

customer_emails = {
'Backpack':['customer1@gmail.com','customer2@gmail.com','customer3@yahoo.com','customer4@msn.com'], 
'Baseball Bat':['customer1@gmail.com','customer3@yahoo.com','customer5@gmail.com'],
'Gloves':['customer2@gmail.com','customer3@yahoo.com','customer4@msn.com']}

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

customers[customers['Baseball Bat'].notna() == True]['Baseball Bat'].isin(customers['Gloves']).sum()

. Я пытаюсь создать DataFrame, который по сути выглядит так, чтобыЯ легко могу использовать его для диаграмм корреляции.

             Backpack  Baseball Bat    Gloves
Backpack            4             2         3
Baseball Bat        2             3         1 
Gloves              3             1         3

Я думаю, что способ сделать это - перебрать словарь customer_emails, но я не уверен, как вы выберете один ключсравнить его значения со всеми остальными и т. д., а затем сохранить его.

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Начните с pd.DataFrame.from_dict:

df = pd.DataFrame.from_dict(customer_emails, orient='index').T

df
              Backpack         Baseball Bat               Gloves
0  customer1@gmail.com  customer1@gmail.com  customer2@gmail.com
1  customer2@gmail.com  customer3@yahoo.com  customer3@yahoo.com
2  customer3@yahoo.com  customer5@gmail.com    customer4@msn.com
3    customer4@msn.com                 None                 None

Теперь используйте stack + get_dummies + sum + dot:

v = df.stack().str.get_dummies().sum(level=1)
v.dot(v.T)

              Backpack  Baseball Bat  Gloves
Backpack             4             2       3
Baseball Bat         2             3       1
Gloves               3             1       3

В качестве альтернативы, переключатель stack с melt для дополнительной производительности.

v = (df.melt()
       .set_index('variable')['value']
       .str.get_dummies()
       .sum(level=0)
)
v.dot(v.T)

variable      Backpack  Baseball Bat  Gloves
variable                                    
Backpack             4             2       3
Baseball Bat         2             3       1
Gloves               3             1       3
0 голосов
/ 14 мая 2018

Используя ту же логику, создайте серию, затем мы используем intersection для списка

s=pd.Series(customer_emails)

pd.DataFrame(np.reshape([len(set(x).intersection(set(y)))for x in s for y in s ],(3,3)),index=s.index,columns=s.index)
Out[299]: 
              Backpack  Baseball Bat  Gloves
Backpack             4             2       3
Baseball Bat         2             3       1
Gloves               3             1       3
0 голосов
/ 14 мая 2018

Сначала вы можете найти все значения для каждого продукта и соответствующих адресов электронной почты, а затем передать полученный словарь на pd.DataFrame:

import pandas as pd
emails = {'Baseball Bat': ['customer1@gmail.com', 'customer3@yahoo.com', 'customer5@gmail.com'], 'Backpack': ['customer1@gmail.com', 'customer2@gmail.com', 'customer3@yahoo.com', 'customer4@msn.com'], 'Gloves': ['customer2@gmail.com', 'customer3@yahoo.com', 'customer4@msn.com']}
results = {a:{c:sum(h in j for h in b) for c, j in emails.items()} for a, b in emails.items()}
df = pd.DataFrame(results)

Вывод:

               Backpack  Baseball Bat  Gloves
Backpack             4             2       3
Baseball Bat         2             3       1
Gloves               3             1       3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...