2017-08-11 227 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之後