如何在没有警告的情况下在熊猫中进行任务?

时间:2016-08-01 15:39:15

标签: python pandas

我正在尝试使用Pandas将R中的代码移植到Python中。

这是我的R代码(假设数据是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)
}

这是我尝试在Python中移植R代码(假设数据为pandas.DataFrame):

import pandas as 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

但后来我收到了这个警告:

  

正在尝试在DataFrame

的切片副本上设置值      

请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy         self._setitem_with_indexer(indexer,value)

我已经阅读并且不明白如何修复它。我该怎么做来修复代码,以便不再有警告?我不想压制警告。

1 个答案:

答案 0 :(得分:1)

如果你想修改传递给函数的同一个对象,那么只要传递给data的对象已经是另一个数据帧的视图,这个就应该有效。

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

如果您想使用副本并返回被操纵的复制数据,那么这就是您的答案。

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