gpt4 book ai didi

python - Pandas 根据分层索引选择 DataFrame GroupBy 中的行

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:37 32 4
gpt4 key购买 nike

我有以下数据框(称为 df):

   user_id  product_id  probReorder
0 1 196 1.0
1 1 10258 0.9
2 1 10326 0.1
3 1 12427 1.0
4 1 13032 0.3
...

对于 df 中的每个 user_id,我只想保留“probReorder”列中具有最大值的 N 行。另外,我希望 N 依赖于 user_id。在我目前的方法中,我有一个字典“lastReordNumber”,其键值对是(user_id, int),我按如下方式选择行:

predictions = []
for usr,data in df.groupby(by="user_id"):
data = data.nlargest(lastReordNumber[usr], "probReorder")
predictions.append(data)
df = pd.concat(predictions)

问题是这真的很慢。数据框有大约 1300 万行和 20 万个唯一的 user_id。有更快/更好的方法吗?

编辑:当给定 user_idprobReorder 列中存在重复值时,前面的代码会产生意外输出。示例:

lastReordNumber = {1:2, 2:3}
df = pd.DataFrame({"user_id":[1,1,1,2,2,2,2],"probReorder":[0.9,0.6,0.9,0.1,1,0.5,0.4],\
"product_id":[1,2,3,4,5,6,7]})

我得到输出:

   probReorder  product_id  user_id
0 0.9 1 1
1 0.9 3 1
2 0.9 1 1
3 0.9 3 1
4 1.0 5 2
5 0.5 6 2
6 0.4 7 2

对于 user_id=2 是我所期望的,但是对于 user_id=1 有重复的行。我的预期输出是:

   probReorder  product_id  user_id
0 0.9 1 1
1 0.9 3 1
2 1.0 5 2
3 0.5 6 2
4 0.4 7 2

这可以通过使用更简单的代码获得

predictions = []
for usr,data in df.groupby(by="user_id"):
predictions.append(data.sort_values('probReorder', ascending=False).head(lastReordNumber[usr]))
predictions = pd.concat(predictions, ignore_index=True)

其中每一列都被完全排序,然后被截断。这也是相当有效的。不过,我还不明白如何解释 nlargest() 方法的结果。

最佳答案

您可以使用 sort_valuesgroupbyhead :

df1 = df.sort_values('probReorder', ascending=False)
.groupby('user_id', group_keys=False)
.apply(lambda x: x.head([x.name]))
print (df1)
probReorder product_id user_id
0 0.9 1 1
2 0.9 3 1
4 1.0 5 2
5 0.5 6 2
6 0.4 7 2

另一种解决方案 nlargest :

df1 = df.groupby('user_id', group_keys=False)
.apply(lambda x: x.nlargest(lastReordNumber[x.name], 'probReorder'))
print (df1)
probReorder product_id user_id
0 0.9 1 1
2 0.9 3 1
4 1.0 5 2
5 0.5 6 2
6 0.4 7 2

关于python - Pandas 根据分层索引选择 DataFrame GroupBy 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44961731/

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