更改特定单元格以插入数据框-复制错误

时间:2019-09-10 09:00:24

标签: python pandas dataframe

我手头有一个数据框。做出预测后,我想用这些值更新该数据框。我知道这个网站也有类似的问题和答案。我尝试了所有这些。但是我不能成功。它给出警告“正在尝试从DataFrame的切片副本上设置一个值”。并且实际上不更新原始数据框。

根据与我的问题类似的问题,我尝试使用iloclociat等更改代码。没有任何效果。

我的代码使用过滤器从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]

我在这个新的数据框中记录了计算结果,它起作用了。我不知道原因。

1 个答案:

答案 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)

另请参阅How to deal with SettingWithCopyWarning in Pandas?