Skip to main content
 首页 » 编程设计

python之Pandas之在数据框中添加一个标志列

2025年05月04日8oomusou

我有一个像这样的数据框:

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 

但这会返回输入数据框。

对于任何形式的帮助,我都将不胜感激。谢谢

请您参考如下方法:

在 pandas 中,您通常不想遍历您的 DataFrame。它很慢,而且几乎所有东西都有更多优化的例程。在你的情况下

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

完成任务。将 df 替换为您的 DataFrame 的名称

编辑:我过度解读了你选择的值应该是唯一的限制。最好事先过滤值,然后过滤 groupby