gpt4 book ai didi

python - 遍历行时如何使用掩码更新 DataFrame 中的值

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:30 28 4
gpt4 key购买 nike

使用下面的代码,当触发 if 语句并放置预测时,我尝试将列 df_test['placed'] 更新为 = 1。不过,我无法让它正确更新,代码编译但不会更新为 = 1 对于放置的相应预测。

df_test['placed'] = np.zeros(len(df_test))
for i in set(df_test['id']) :
mask = df_test['id']==i
predictions = lm.predict(X_test[mask])
j = np.argmax(predictions)
if predictions[j] > 0 :
df_test['placed'][mask][j] = 1
print(df_test['placed'][mask][j])

最佳答案

回答你的问题

编辑:根据评论更改建议

代码的赋值部分,df_test['placed'][mask][j] = 1,使用所谓的 chained indexing .简而言之,您的任务只会更改立即丢弃的 DataFrame 的临时副本,而不会更改原始 DataFrame。

为避免这种情况,赋值时的经验法则是:在单个 DataFrame 上仅使用一组方括号。对于您的问题,应该如下所示:

df_test.loc[mask.nonzero()[0][j], 'placed'] = 1

(我知道 mask.nonzero() 使用两组方括号;实际上 nonzero() 返回一个元组,而该元组的第一个元素元组是一个 ndarray。但数据框只使用一组,这是重要的部分。)

一些其他注意事项

我有一些关于使用 pandas (& numpy) 的笔记。

  • Pandas 和 NumPy 都有一个称为广播的功能。基本上,如果您要为整个数组分配一个值,则不需要先创建一个相同大小的数组;你可以只分配一个值,pandas/NumPy 会自动为你计算出如何应用它。因此,您的代码的第一行可以替换为 df_test['placed'] = 0,它完成同样的事情。

  • 一般来说在处理 pandas 和 numpy 对象时,循环不好;通常,您可以找到一种方法,结合使用广播逐元素操作 bool 索引 来执行循环的操作。由于这些功能的设计方式,它的运行速度也会快得多。不幸的是,我对 lm.predict 方法不够熟悉,所以您可以完全避免使用此代码的整个 for 循环。

关于python - 遍历行时如何使用掩码更新 DataFrame 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53789336/

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