我有一组产品,用它们的代码表示,并且我对当月销售量最高的5种产品感兴趣(假设他们的product_id
的产品是P112(排名第一),P134(排名第二) ,P219(前3名),P361(前4名)和P443(前5名),尽管这些情况每个月都在变化。我有一个包含employee_id
,customer_id
,product_id
和purchase_date
的表,并且表中的每一行都代表一个销售。我只对具有前5名产品的销售感兴趣,因为我想显示每个员工的前5名销售的分布。本质上,我想创建一个新表,该表的每一行都有一个唯一的雇员,然后按列将前5个产品中的每一个有多少销售。
给出下表(实际上是更长的时间)和前5种产品的ID:
Employee_id | Customer_id | Product_id | Date |
E12 | C10 | P112 | 10/05/18 |
E11 | C5 | P400 | 10/05/18 |
E20 | C19 | P219 | 10/06/18 |
E23 | C10 | P155 | 10/07/18 |
E19 | C06 | P219 | 10/07/18 | ...
结果数据框看起来像这样
Employee_id | Top1 | Top2 | Top3 | Top4 | Top5 |
E12 | 1 | 0 | 5 | 6 | 0 |
E19 | 3 | 2 | 1 | 0 | 1 |
E23 | 2 | 1 | 0 | 4 | 2 |
E44 | 0 | 0 | 0 | 0 | 0 | ...
我不确定如何以清晰明了的方式从第一个数据帧转到第二个数据帧。我打算使用熊猫。我的一个想法是遍历第一个数据框,并为每个顶级产品创建一个字典,其中的键将是employee_id
,值将是计数(如果顶级产品显示,则该值将递增为一个雇员)。但是,缺少许多实现细节。我喜欢任何指导,代码或建议的方法。谢谢!
答案 0 :(得分:3)
首先仅用boolean indexing
用isin
过滤top5乘积,然后用size
计数并用unstack
整形,再添加reindex
以使列正确排序最后使用f-strings
和list comprehension
创建新的列名称:
#top5 created dynamically from column Product_id
#top5 = df['Product_id'].value_counts().index[:5])
top5 = ['P112','P134','P219','P361','P443']
df = (df[df['Product_id'].isin(top5)]
.groupby(['Employee_id','Product_id'])
.size()
.unstack(fill_value=0)
.reindex(columns=top5, fill_value=0))
df.columns = [f'Top{x}' for x in range(1,6)]
print (df)
Top1 Top2 Top3 Top4 Top5
Employee_id
E12 1 0 0 0 0
E19 0 0 1 0 0
E20 0 0 1 0 0
df = df.reset_index()
print (df)
Employee_id Top1 Top2 Top3 Top4 Top5
0 E12 1 0 0 0 0
1 E19 0 0 1 0 0
2 E20 0 0 1 0 0