比较字典的值并返回匹配值的计数

Tre*_*ore 7 python dictionary crosstab dataframe pandas

我有一个由产品名称和唯一客户电子邮件组成的字典,他们购买了这样的项目:

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']}
Run Code Online (Sandbox Code Playgroud)

我试图迭代每个键的值,并确定其他键中有多少电子邮件匹配.我将这个字典转换为DataFrame,并使用类似的东西得到了我想要的单列比较答案

customers[customers['Baseball Bat'].notna() == True]['Baseball Bat'].isin(customers['Gloves']).sum()
Run Code Online (Sandbox Code Playgroud)

我想要完成的是创建一个基本上看起来像这样的DataFrame,以便我可以轻松地将它用于相关图表.

             Backpack  Baseball Bat    Gloves
Backpack            4             2         3
Baseball Bat        2             3         1 
Gloves              3             1         3
Run Code Online (Sandbox Code Playgroud)

我认为这样做的方法是遍历customer_emails字典,但我不确定如何选择单个键来将其值与其他所有其他值进行比较等等,然后存储它.

cs9*_*s95 6

开始于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
Run Code Online (Sandbox Code Playgroud)

现在,使用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
Run Code Online (Sandbox Code Playgroud)

或者,切换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
Run Code Online (Sandbox Code Playgroud)