我有一个数据框 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']
为什么我会收到复制警告,我该如何解决?
答案 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)
,我们不会收到您的警告。
现在,如果另一个数据框是从 df
过滤的,并且我们执行相同的操作,我们将收到此警告。
最后,通过添加 .copy()
,过滤后,我们将不再有警告。
希望这会有所帮助。氪
答案 2 :(得分:-1)
如果其他解决方案不起作用,可以使用以下方法忽略此警告:
import pandas as pd
pd.options.mode.chained_assignment = None
在 Spinnet 上方运行一次,不再收到 SettingWithCopyWarning