Python 在数据帧中跨列查找匹配值
是否有一个内置函数,只允许选择具有匹配列值的行 例如,我有一个pandas数据框,它由用户列、他们对每个电影项目进行评级的列以及他们对它的评级组成(见下文)。有没有一种方法可以使用numpy或pandas快速选择两个用户都评级过的电影?换言之,输出一个列表/数组/数据帧,该列表/数组/数据帧包含已由相关用户(a)和其他所有用户评级的所有电影 在下面的示例中,所有用户都将电影评级为7。因此,对于用户(a)=8的查询,理想情况下会输出该用户和其他用户的所有常用评级Python 在数据帧中跨列查找匹配值,python,pandas,numpy,Python,Pandas,Numpy,是否有一个内置函数,只允许选择具有匹配列值的行 例如,我有一个pandas数据框,它由用户列、他们对每个电影项目进行评级的列以及他们对它的评级组成(见下文)。有没有一种方法可以使用numpy或pandas快速选择两个用户都评级过的电影?换言之,输出一个列表/数组/数据帧,该列表/数组/数据帧包含已由相关用户(a)和其他所有用户评级的所有电影 在下面的示例中,所有用户都将电影评级为7。因此,对于用户(a)=8的查询,理想情况下会输出该用户和其他用户的所有常用评级 user movie r
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
也许是这样的:
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
也许是这样的:
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
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)
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。我没有意识到这一点。我认为这忽略了查找用户8已评论的电影的重要部分,例如,可能也是1333。谢谢@AndyHayden。我不知道是这样的。