gpt4 book ai didi

pandas - 基于多列在 DataFrame 中搜索值

转载 作者:行者123 更新时间:2023-12-04 01:39:14 24 4
gpt4 key购买 nike

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

从如下所示的 DataFrame 开始

我的数据如下:

    userID  movieID rating
0 196 242 3
1 186 302 3
2 22 377 1

现在,我想提取以下情况的评分:

userID == 196
movieID == 242

结果应该是 3。

I solved it, using the following code: However this isn't very efficient. Does anyone have a better approach?

df.loc[df['userID'] == 196].where(df['movieID'] == 242).dropna()['rating']

Which gives me the rating for the movie with ID 242, and user ID 196.

最佳答案

Index 查找在 pandas 中非常快,所以最好尽可能使用它。如果用户只能对每部电影评分一次,MultiIndex 是理想的选择。

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)

设置 MultiIndex 确实需要时间,因此对于单个查询来说可能代价高昂。但对于许多人来说,它会很快得到返回,尤其是对于更大的 DataFrame。这是一个计时示例,我们可以在其中使用唯一的 MulitIndex(在设置索引之后)。

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

enter image description here

关于pandas - 基于多列在 DataFrame 中搜索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58238402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com