我手头有一个数据框。做出预测后,我想用这些值更新该数据框。我知道这个网站也有类似的问题和答案。我尝试了所有这些。但是我不能成功。它给出警告“正在尝试从DataFrame的切片副本上设置一个值”。并且实际上不更新原始数据框。
根据与我的问题类似的问题,我尝试使用iloc
,loc
,iat
等更改代码。没有任何效果。
我的代码使用过滤器从pred_set中获取一个子数据帧,然后按行逐行进行预测。上排的预测必须更新下排的单元格。因此,我将随着移动的月份做出未来的预测。
for key in list(mi.unique_everseen(pred_set['from'] + pred_set['to'])):
for i in range(0, predmonths):
pred = pred_set[(pred_set['from'] + pred_set['to']) == key].iloc[[i],:]
pred_val = all_pipe_final.predict(pred)
for j in range (i+1, predmonths):
pred_set.loc[(pred_set['from'] + pred_set['to']) == key, :].iloc[j, pred_set.columns.get_loc(str('M-'+str(j)))] = pred_val[0]
#variation 2#pred_set[(pred_set['from'] + pred_set['to']) == key].iloc[j, pred_set.columns.get_loc(str('M-'+str(j)))] = pred_val[0]
#variation 3#pred_set[(pred_set['from'] + pred_set['to']) == key].iloc[[j], [pred_set.columns.get_loc(str('M-'+str(j)))]] = pred_val[0]
如前所述,此代码部分和变体不会更新单元格。看起来,我正在处理数据帧的副本,而不是原始副本。我想知道这是什么原因。
最终我改变了结构并添加:
pred_subset = pred_set[(pred_set['from'] + pred_set['to']) == key]
我在这个新的数据框中记录了计算结果,它起作用了。我不知道原因。
答案 0 :(得分:0)
获得A value is trying to be set on a copy of a slice from a DataFrame.
时,表示您正在处理副本,这意味着所做的更改也将影响“源数据”。
通常这是一个很好的警告,可以通过使用df = df.copy()
来解决...如果您确实不希望通过将pd.options.mode.chained_assignment
设置为None
(并还原它)来进行复制在您遇到问题的障碍之后,显然)
现在,就您而言,我怀疑是pred_set.loc[(pred_set['from'] + pred_set['to']) == key, :].iloc[....]
的原因。该风险似乎已得到控制,因此您可以在该区域中禁用该警告。
这是一个例子:
import pandas as pd
import seaborn as sns
import warnings
iris = sns.load_dataset('iris')
irisSub = iris.head(3)
irisSub.species = 'Spam' # will raise the warning
print(iris) # iris top 3 rows are impacted
old_ca = pd.options.mode.chained_assignment
pd.options.mode.chained_assignment = None
irisSub.species = 'Eggs' # won't raise the warning
pd.options.mode.chained_assignment = old_ca # restore
print(iris)