Python:如何查找三元组用户访问过的三元组

前端之家收集整理的这篇文章主要介绍了Python:如何查找三元组用户访问过的三元组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个CSV文件,其中包含用户访问的项目列表,例如:

  1. user_id item_id
  2. 370 293
  3. 471 380
  4. 280 100
  5. 280 118
  6. 219 118
  7. ...

列表很长 – 30M行.

我需要找到三个用户访问过的项目的三元组(即所有三个用户都访问了所有三个项目).这种三胞胎很少见.我试图找到的示例结果:

  1. user_id item_id
  2. 1 15
  3. 1 26
  4. 1 31
  5. 77 15
  6. 77 26
  7. 77 31
  8. 45 15
  9. 45 26
  10. 45 31

有什么好办法呢?我可以使用Pandas或任何其他库.

最佳答案
您可以使用transform大小,然后按boolean indexing过滤:

  1. print (df)
  2. user_id item_id
  3. 0 1 15
  4. 1 1 26
  5. 2 1 31
  6. 3 77 15
  7. 4 77 26
  8. 5 77 31
  9. 6 45 15
  10. 7 45 26
  11. 8 45 31
  12. 9 370 293
  13. 10 471 380
  14. 11 280 100
  15. 12 280 118
  16. 13 219 118
  1. print (df.groupby('user_id')['item_id'].transform('size'))
  2. 0 3
  3. 1 3
  4. 2 3
  5. 3 3
  6. 4 3
  7. 5 3
  8. 6 3
  9. 7 3
  10. 8 3
  11. 9 1
  12. 10 1
  13. 11 2
  14. 12 2
  15. 13 1
  16. Name: item_id,dtype: int64
  17. print (df[df.groupby('user_id')['item_id'].transform('size') == 3])
  18. user_id item_id
  19. 0 1 15
  20. 1 1 26
  21. 2 1 31
  22. 3 77 15
  23. 4 77 26
  24. 5 77 31
  25. 6 45 15
  26. 7 45 26
  27. 8 45 31

使用filtration解决方案更慢:

  1. df = df.groupby('user_id').filter(lambda x: len(x.item_id) == 3)
  2. print (df)
  3. user_id item_id
  4. 0 1 15
  5. 1 1 26
  6. 2 1 31
  7. 3 77 15
  8. 4 77 26
  9. 5 77 31
  10. 6 45 15
  11. 7 45 26
  12. 8 45 31

猜你在找的Python相关文章