【问题标题】:Finding matching values across columns in a pandas dataframe在 pandas 数据框中跨列查找匹配值
【发布时间】:2017-10-26 10:50:08
【问题描述】:

是否有一个内置函数允许在 pandas 中仅选择具有匹配列值的行?

例如,我有一个 pandas 数据框,它由用户列、他们评价的每个电影项目以及他们给它的评价组成(见下文)。有没有办法使用 numpy 或 pandas 快速选择两个用户都评价过的电影?换句话说,输出一个列表/数组/数据框,其中包含有问题的用户 (a) 和所有其他用户已评分的所有电影?

在下面的示例中,所有用户都对电影 7 评分。因此,对于用户 (a)=8 的查询,理想情况下会输出该用户和其他所有用户的所有常见评分。

user    movie   rating
8        7        5.0
8       1333      3.0
50      3321      1.0
50      3363      2.0
50        7       3.0
83       50       4.0
83       7        5.0
etc      etc      etc

output for user 8
50        7       3.0
83       7        5.0

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    可能是这样的:

    In [11]: df.loc[(df["user"] != 8) & (df["movie"].isin(df.loc[(df.user == 8), "movie"]))]
    Out[11]:
       user  movie  rating
    4    50      7     3.0
    6    83      7     5.0
    

    【讨论】:

      【解决方案2】:

      IIUC,你想要所有评价过电影 7 的用户,除了 8:

      df[(df["movie"].isin(df.loc[(df.user == 8), "movie"])) & (df.user!=8)]
      

      这比安迪在下面的回答略快:

      %%timeit 
      df[(df["movie"].isin(df.loc[(df.user == 8), "movie"])) & (df.user!=8)]
      1.13 ms ± 54.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      
      %%timeit 
      df.loc[(df["user"] != 8) & (df["movie"].isin(df.loc[(df.user == 8), "movie"]))]
      1.21 ms ± 110 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      

      【讨论】:

      • 我认为这错过了查找用户 8 评论过哪些电影的重要部分,例如也可能是 1333。
      • 谢谢@AndyHayden。没想到是这样的。
      猜你喜欢
      • 1970-01-01
      • 2016-01-23
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2021-08-28
      • 2019-01-13
      相关资源
      最近更新 更多