我有一个像这样的数据框:
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/