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

标签 python pandas dataframe iterator

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

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

关于python - Pandas - 在数据框中添加一个标志列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45630410/

相关文章:

r - 更改 R 中数据框列表中的列名称

Python 将特定列表的列表连接到数据帧

python - 为什么 Poloniex API 被验证码屏蔽?应为 JSON,但响应为 HTML

python - 在自动点击下载链接后,使用 Selenium、Firefox、Python 将 EPS 文件下载保存到磁盘

python - Django Haystack/Elasticsearch dwithin 只返回一个 SearchResult。期待几个

python - 如果至少有一个值低于阈值,则选择给定 2 列的行

python - 相当于 Pandas 中 SQL 的 LIMIT 和 OFFSET?

python - 识别 python pandas 中的重复对

Python pandas cumsum()在达到最大值后重置

python - 在不合并的情况下扩展 pandas 列