// An highlighted block
data={'age':[11,12,13,14,15,16,17],
'number':[1,2,3,4,5,6,7],
'name':['a','b','c','d','e','f','g'],
'score':[20,30,40,50,70,80,90]}
df=pd.DataFrame(data)
df1=df[df['score']<60]
df1['score']='fail'
print(df1)
输出为:
// A code block
******************************
***********.py:21: 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
df1['score']='fail'
age name number score
0 11 a 1 fail
1 12 b 2 fail
2 13 c 3 fail
3 14 d 4 fail
Process finished with exit code 0
我将原始的dataframe进行条件筛选后赋给df1,在更改df1中某一列的值的时候,总是有以上的告警出现,虽然并不会影响程序的运行,但是我有强迫症,必须要消除这个告警,而且有告警存在就说明编写的程序存在风险,去网上查了,说使用.loc方法修改列值,但是没有效果。
我们来看告警,说的是试图在来自DataFrame的副本上设置值。我认为,这种告警的发出是系统认为我们对副本中值的更改会影响到原始dataframe中值得改变,本质上是说df1=df并非是单纯新建了另一个dataframe,更可能是给原dataframe多加了一种索引(当然事实并不是这样),这里我们在更改df2 中的值之前加上一行
// An highlighted block
df2.is_copy=False
运行以后没有告警发出,这意味着我们是新建了一个df2,并非是索引。