查询数据框以在熊猫中创建新的数据框

时间:2018-10-16 05:09:11

标签: python pandas dictionary dataframe

我有一组产品,用它们的代码表示,并且我对当月销售量最高的5种产品感兴趣(假设他们的product_id的产品是P112(排名第一),P134(排名第二) ,P219(前3名),P361(前4名)和P443(前5名),尽管这些情况每个月都在变化。我有一个包含employee_idcustomer_idproduct_idpurchase_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,值将是计数(如果顶级产品显示,则该值将递增为一个雇员)。但是,缺少许多实现细节。我喜欢任何指导,代码或建议的方法。谢谢!

1 个答案:

答案 0 :(得分:3)

首先仅用boolean indexingisin过滤top5乘积,然后用size计数并用unstack整形,再添加reindex以使列正确排序最后使用f-stringslist 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