从数据框列中减去值:SettingWithCopyWarning

时间:2021-01-19 07:59:19

标签: python pandas

我有一个数据框 df

                    A           B           C
Date    
24/03/2014  -0.114726   -0.076779   -0.012105
25/03/2014  -0.118673   -0.078756   -0.008158
26/03/2014  -0.132919   -0.078067    0.006088
27/03/2014  -0.153581   -0.068223    0.026750
28/03/2014  -0.167744   -0.063045    0.040913
31/03/2014  -0.167399   -0.067346   -0.040568
01/04/2014  -0.166249   -0.068801    0.039418
02/04/2014  -0.160876   -0.077259    0.034045
03/04/2014  -0.156089   -0.090062    0.029258
04/04/2014  -0.161735   -0.079317   -0.034904
07/04/2014  -0.148305   -0.080767    0.021474
08/04/2014  -0.150812   -0.074792    0.023981
09/04/2014  -0.135339   -0.079736    0.008508
10/04/2014  -0.156345   -0.083574    0.029514

我正在选择列 B 的最后一个值:

testValue=df['B'].iloc[-1]

在这种情况下 testValue 等于 -0.083574

然后我试图创建一个新列 'D',我从列 testValue' 的所有元素中减去 'C。所以我想要的输出看起来像:

                   A            B           C           D
    Date    
24/03/2014  -0.114726   -0.076779   -0.012105   -0.071469
25/03/2014  -0.118673   -0.078756   -0.008158   -0.075416
26/03/2014  -0.132919   -0.078067    0.006088   -0.089662
27/03/2014  -0.153581   -0.068223    0.026750   -0.110324
28/03/2014  -0.167744   -0.063045    0.040913   -0.124487
31/03/2014  -0.167399   -0.067346   -0.040568   -0.043006
01/04/2014  -0.166249   -0.068801    0.039418   -0.122992
02/04/2014  -0.160876   -0.077259    0.034045   -0.117619
03/04/2014  -0.156089   -0.090062    0.029258   -0.112832
04/04/2014  -0.161735   -0.079317   -0.034904   -0.048670
07/04/2014  -0.148305   -0.080767    0.021474   -0.105048
08/04/2014  -0.150812   -0.074792    0.023981   -0.107555
09/04/2014  -0.135339   -0.079736    0.008508   -0.092082
10/04/2014  -0.156345   -0.083574    0.029514   -0.113088

从我使用的列 testValue 中减去 'C'

df['D']=testValue-df['C']

但是我收到以下复制警告:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  df['D']=testValue-df['C']

为什么我会收到复制警告,我该如何解决?

3 个答案:

答案 0 :(得分:1)

您可以通过 DataFrame.loc 更改选择最后一个值:

df['D']=df.loc[df.index[-1], 'B']-df['C']

或按 DataFrame.iloc 位置按 B 列按 Index.get_loc

df['D']=df.iloc[-1, df.columns.get_loc('B')]-df['C']

如果还是报错,可以查看df是如何创建的,如果有过滤需要DataFrame.copy

df = df1[df1['C'] > -0.3].copy()

df['D']=df.loc[df.index[-1], 'B']-df['C']

如果您稍后修改 df 中的值,您会发现修改不会传播回原始数据 (df1),并且 Pandas 会发出警告。

答案 1 :(得分:1)

您收到的警告表明您正在设置某个原始数据的副本。就你的数据显示,没有这样的复制操作,尤其是你怀疑的那一行:df['D']=testValue-df['C']

我敢打赌,您的 df 是其他事物的子集。如果是这种情况,您可以通过在过滤操作的末尾显式添加 .copy() 来解决此问题。

例如,如果我们从头开始创建一个 df,例如df = pd.DataFrame(data),我们不会收到您的警告。
No warning if df is initial data

现在,如果另一个数据框是从 df 过滤的,并且我们执行相同的操作,我们将收到此警告。
Have the SettingWithCopyWarning

最后,通过添加 .copy(),过滤后,我们将不再有警告。

no SettingWithCopyWarning warning

希望这会有所帮助。氪

答案 2 :(得分:-1)

如果其他解决方案不起作用,可以使用以下方法忽略此警告:

import pandas as pd
pd.options.mode.chained_assignment = None

在 Spinnet 上方运行一次,不再收到 SettingWithCopyWarning