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)"
)