gpt4 book ai didi

python - 'nlargest' 返回奇怪的结果

转载 作者:行者123 更新时间:2023-12-05 05:51:36 24 4
gpt4 key购买 nike

我正在尝试使用“最大”获取前“n”个结果,但我认为这种行为很奇怪。如果有人能帮助我理解为什么会出现这种行为,那就太好了。

filter = pd.DataFrame([['user1','item2',2,1],
['user1','item1',2,0.666667],
['user1','item3',2,0.500000]],
columns=['user_id','item_id','num_transactions','RCP'])

sort_RCP_df = (
filter.set_index("item_id")
.groupby(["user_id"])["RCP"]
.nlargest(2)
.reset_index()
)
print(sort_RCP_df)

user_id item_id RCP
user1 item2 1.000000
user1 item1 0.666667

如果我保留 nlargest(2),那么我会得到正确的输出,但如果我将值更改为 3,我只会得到列 item_id 和 RCP。

filter = pd.DataFrame([['user1','item2',2,1],
['user1','item1',2,0.666667],
['user1','item3',2,0.500000]],
columns=['user_id','item_id','num_transactions','RCP'])

sort_RCP_df = (
filter.set_index("item_id")
.groupby(["user_id"])["RCP"]
.nlargest(3)
.reset_index()
)
print(sort_RCP_df)

item_id RCP
item2 1.000000
item1 0.666667
item3 0.500000

为什么 nlargest = 3 时列 'user_id' 没有出现?

如果这是预期的行为,有没有办法让“user_id”也成为输出的一部分?

最佳答案

文档暗示了问题的原因,因为在注释中他们明确指出了性能方面的考虑:

Faster than .sort_values(ascending=False).head(n) for small n relative to the size of the Series object.

如果深入查看代码,Series.nlargest/Series.nsmallestSelectNSeries 处理pandas/core/algorithms 中的类。根据相对于 Series 长度的 n,此类具有不同的行为:

# slow method
if n >= len(self.obj):
ascending = method == "nsmallest"
return dropped.sort_values(ascending=ascending).head(n)

# fast method
arr, new_dtype = _ensure_data(dropped.values)
if method == "nlargest":
arr = -arr
if is_integer_dtype(new_dtype):
# GH 21426: ensure reverse ordering at boundaries
arr -= 1

...

这里的关键是,当 n >= length of Series 时,调用不使用正常算法来计算最大值/最小值,而是使用 计算它排序值 + head。如果我们用此逻辑替换您的 nlargest 调用,我们可以看到它手动匹配您的输出。

sort_RCP_df = (
filter.set_index("item_id")
.groupby(["user_id"])["RCP"]
.apply(lambda s: s.sort_values(ascending=False).head(2))
.reset_index()
)

# user_id item_id RCP
#0 user1 item2 1.000000
#1 user1 item1 0.666667

关于python - 'nlargest' 返回奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70354691/

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