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字典,但我不确定如何选择单个键来将其值与其他所有其他值进行比较等等,然后存储它.
开始于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)
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |