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
Post a Comment