SettingWithCopyWarning的解决办法

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

// 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,并非是索引。

你可能感兴趣的:(python)