2017-08-11 226 views
2

添加标记专栏中,我有一个像数据帧:大熊猫 - 在数据帧

Client_ID Product_nb Item_id 
1   1   i1 
1   1   i2 
1   1   i3 

1   2   i2 
1   2   i5 
1   2   i7 

1   3   i1 
1   3   i2 
1   3   i4 
1   3   i6 

2   1   i1 
2   1   i2 
2   1   i3 
2   1   i4 

2   2   i1 
2   2   i2 
...   ...   ... 

所以每个客户端(client_id)有几个产品(Product_nb)。对于每种产品,我只想保留一件商品(item_id)。对于同一个客户,下一个产品不应该与之前的产品相对应。

我要添加每个项目旁边的一个标志,如果我需要保留的项目或不:

Client_ID Product_nb Item_id Keep 
1   1   i1  1 
1   1   i2  0 
1   1   i3  0 

1   2   i2  1 
1   2   i5  0 
1   2   i7  0 

1   3   i1  0 
1   3   i2  0 
1   3   i4  1 
1   3   i6  0 

2   1   i1  1 
2   1   i2  0 
2   1   i3  0 
2   1   i4  0 

2   2   i1  0 
2   2   i2  1 
...   ...   ...  ... 

我这个想法是遍历所有的客户和产品。对于每个客户端,保存已保存在列表中的项目:

df = df.set_index(['client_id','product_nb','item_id','keep']) 
client_ids = df.index.get_level_values('client_id').unique() 
for client in client_ids: 
    list_already = [] 
    prod_nbs = df.loc[client].index.get_level_values('product_nb').unique() 
    for prod_nb in prod_nbs: 
     item_ids = df.loc[client,prod_nb].index.get_level_values('item_id').unique() 
     for item_id in item_ids: 
      if (item_id in list_already): 
       df.loc[client,prod_nb,item_id,'keep'] = 1 
       continue 
      else: 
       list_already.append(item_id) 
       df.loc[client,prod_nb,item_id,'keep'] = 1 
       break 

但是,这会返回输入数据帧。

我会很乐意提供任何形式的帮助。谢谢

回答

-1

在大熊猫中,你通常不想循环使用DataFrame。它很慢,几乎所有东西都有更多的优化例程。在你的情况下,

df.groupby(['Client_ID', 'Product_nb'])['Item_id'].first() 

完成这项工作。用您的DataFrame的名称替换df

编辑:我重读了这个限制,您选择的值应该是唯一的。事先过滤数值可能最好,groupby之后