Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据帧中跨列查找匹配值_Python_Pandas_Numpy - Fatal编程技术网

Python 在数据帧中跨列查找匹配值

Python 在数据帧中跨列查找匹配值,python,pandas,numpy,Python,Pandas,Numpy,是否有一个内置函数,只允许选择具有匹配列值的行 例如,我有一个pandas数据框,它由用户列、他们对每个电影项目进行评级的列以及他们对它的评级组成(见下文)。有没有一种方法可以使用numpy或pandas快速选择两个用户都评级过的电影?换言之,输出一个列表/数组/数据帧,该列表/数组/数据帧包含已由相关用户(a)和其他所有用户评级的所有电影 在下面的示例中,所有用户都将电影评级为7。因此,对于用户(a)=8的查询,理想情况下会输出该用户和其他用户的所有常用评级 user movie r

是否有一个内置函数,只允许选择具有匹配列值的行

例如,我有一个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

也许是这样的:

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。我不知道是这样的。