python - How to do assignment in Pandas without warning? -


i'm trying port code in r python using pandas.

this r code (assume data data.frame):

transform <- function(data) {     basevalue <- data$basevalue      na.base.value <- is.na(basevalue)     basevalue[na.base.value] <- 1      zero.base.value <- basevalue == 0     basevalue[zero.base.value] <- 1      data$adjustedbasevalue <- data$baseratio * basevalue      basevalue[na.base.value] <- -1     basevalue[zero.base.value] <- 0     data$basevalue <- basevalue      return(data) } 

this attempt port r code in python (assume data pandas.dataframe):

import pandas pd  def transform(data):     base_value = data['basevalue']      na_base_value = base_value.isnull()     base_value.loc[na_base_value] = 1      zero_base_value = base_value == 0     base_value.loc[zero_base_value] = 1      data['adjustedbasevalue'] = data['baseratio'] * base_value      base_value.loc[na_base_value] = -1     base_value.loc[zero_base_value] = 0      return data 

but got warning:

a value trying set on copy of slice dataframe

see caveats in documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy self._setitem_with_indexer(indexer, value)

i have read through , don't understand how fix it. should fix code there no more warning? don't want suppress warning though.

if want modify same object passed function, should work long what's passed in data isn't view of dataframe.

def transform(data):     base_value = data['basevalue']      na_base_value = base_value.isnull()     data.loc[na_base_value, 'basevalue'] = 1      zero_base_value = base_value == 0     data.loc[zero_base_value, 'basevalue'] = 1      data['adjustedbasevalue'] = data['baseratio'] * base_value      data.loc[na_base_value, 'basevalue'] = -1     data.loc[zero_base_value, 'basevalue'] = 0      return data 

if want work copy , return manipulated copied data answer.

def transform(data):     data = data.copy()      base_value = data['basevalue'].copy()      na_base_value = base_value.isnull()     base_value.loc[na_base_value] = 1      zero_base_value = base_value == 0     base_value.loc[zero_base_value] = 1      data['adjustedbasevalue'] = data['basevalue'] * base_value      base_value.loc[na_base_value] = -1     base_value.loc[zero_base_value] = 0      return data 

Comments