我有一组产品,由其代码表示,并且我对该月销量排名前 5 的产品感兴趣(假设它们的 product_id
是 P112(前 1 名)、P134(前 2 名)、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 | ...
我不确定如何以干净清晰的方式从第一个数据帧转到第二个数据帧。我本来打算使用 Pandas。我的一个想法是迭代第一个数据帧,并为每个顶级产品创建一个字典,其中键是employee_id,值是计数(如果顶级产品向员工展示)。但缺少许多实现细节。我希望有任何指导、代码或建议的方法。谢谢!
最佳答案
首先按 boolean indexing
筛选前 5 个产品与 isin
,然后按 size
获取计数并通过 unstack
reshape ,添加reindex
为了正确排序列并最后使用f-strings
和列表理解
创建新列名称:
#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
关于python - 查询数据框以在 pandas 中创建新数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52828278/