在pandas数据框中的列之间查找匹配值

时间:2017-10-26 02:32:17

标签: python pandas numpy

是否有内置函数允许仅选择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

2 个答案:

答案 0 :(得分:4)

也许是这样的:

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

答案 1 :(得分:1)

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)