代码之家  ›  专栏  ›  技术社区  ›  Jane Sully

查询dataframe以在中创建新的dataframe

  •  1
  • Jane Sully  · 技术社区  · 6 年前

    product_id 它们分别是P112(前1)、P134(前2)、P219(前3)、P361(前4)和P443(前5),尽管它们每月都在变化。我有一张桌子 employee_id , customer_id , 产品id ,和 purchase_date ,表中的每一行表示一次销售。我只对前五名产品的销售额感兴趣,因为我想展示每个员工前五名销售额的分布情况。基本上,我想创建一个新表,该表的每一行都有一个惟一的employee,然后以列的形式列出前5个产品中每个产品的销售额。

    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 | ...
    

    我不知道如何从第一个数据帧到第二个数据帧以一种干净清晰的方式。我打算用熊猫。我的一个想法是遍历第一个数据帧,为每个顶级产品创建一个字典,其中的关键是 员工id

    1 回复  |  直到 6 年前
        1
  •  3
  •   jezrael    6 年前

    第一只过滤前5名产品 boolean indexing 具有 isin 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