Pandas 基于多列的DataFrame中的搜索值

Pandas 基于多列的DataFrame中的搜索值,pandas,dataframe,Pandas,Dataframe,问题: 针对多列值约束,提取特定列的值(在本例中为“评级”) 从如下所示的数据帧开始 我的数据如下: userID movieID rating 0 196 242 3 1 186 302 3 2 22 377 1 现在,我想提取以下情况的评级: userID == 196 movieID == 242 结果应该是3 我用以下代码解决了这个问题:但是这不是很有效。有人有更好的方法吗? df.loc[df['userID'] == 196].where(df['movi

问题: 针对多列值约束,提取特定列的值(在本例中为“评级”)

从如下所示的数据帧开始

我的数据如下:

    userID  movieID rating
0   196 242 3
1   186 302 3
2   22  377 1
现在,我想提取以下情况的评级:

userID == 196
movieID == 242
结果应该是3

我用以下代码解决了这个问题:但是这不是很有效。有人有更好的方法吗?

df.loc[df['userID'] == 196].where(df['movieID'] == 242).dropna()['rating']
这给了我ID为242,用户ID为196的电影的评级


索引
在pandas中查找速度非常快,因此最好尽可能使用它。如果用户只能对每部电影进行一次评分,
多索引
非常适合这样做

df = df.set_index(['userID', 'movieID'])
df.at[(196, 242), 'rating']
#3

一些时间安排。一旦设置了索引,查找就会非常快

%timeit df.at[(userID, movieID), 'rating']
#19.9 µs ± 405 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

df1 = df.reset_index()
%timeit df1.loc[df1['userID'].eq(196) & df1['movieID'].eq(242), 'rating']
#1.2 ms ± 6.98 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
设置
多索引
确实需要时间,因此单个查询的成本可能会很高。但对许多人来说,这将很快得到回报,尤其是在数据帧更大的情况下。下面是一个计时示例,我们可以在其中使用唯一的MulitIndex(在设置索引之后)


df.loc[df['userID'].eq(196)和df['movieID'].eq(242),'rating']
?哦,谢谢。我以前尝试过使用关键字“and”,但似乎“&”是trickI建议在本例中使用多索引的关键字,因为它似乎是一个唯一的键
df=df.set_index(['userID','movieID'])
,这使得选择非常简单:
df.at[(196242),'rating']
感谢您的解释和努力!现在工作得快多了。
import perfplot
import pandas as pd
import numpy as np

perfplot.show(
    setup=lambda n: pd.DataFrame({'userID': range(n),
                                  'movieID': range(n),
                                  'rating': range(n)}).set_index(['userID', 'movieID']), 
    kernels=[
        lambda df: df.at[(4 ,4), 'rating'],
        lambda df: df.loc[(df.index.get_level_values('userID') == 4) 
                          & (df.index.get_level_values('movieID') == 4), 'rating']
    ],
    labels=["MultiIndex", "Boolean Slice"],
    n_range=[2 ** k for k in range(5, 25)],
    equality_check=np.allclose,  
    xlabel="len(df)"
)