17

我一直在阅读有关“返回视图与副本”的链接。我真的不明白Pandas 中的链式赋值.ix()概念是如何工作的,以及.iloc()、 或的使用如何.loc()影响它。

我收到SettingWithCopyWarning以下代码行的警告,其中data是 Panda 数据框,并且amount是该数据框中的列(系列)名称:

data['amount'] = data['amount'].astype(float)

data["amount"].fillna(data.groupby("num")["amount"].transform("mean"), inplace=True)

data["amount"].fillna(mean_avg, inplace=True)

看看这段代码,很明显我在做一些次优的事情吗?如果是这样,你能告诉我替换代码行吗?

我知道以下警告,并认为我的情况下的警告是误报:

链式分配警告/异常旨在通知用户可能无效的分配。可能有误报;无意中报告了链式分配的情况。

编辑:导致第一个复制警告错误的代码。

data['amount'] = data.apply(lambda row: function1(row,date,qty), axis=1) 
data['amount'] = data['amount'].astype(float)

def function1(row,date,qty):
    try:
        if(row['currency'] == 'A'):
            result = row[qty]
        else:
            rate = lookup[lookup['Date']==row[date]][row['currency'] ]
            result = float(rate) * float(row[qty])
        return result
    except ValueError: # generic exception clause
        print "The current row causes an exception:"
4

1 回答 1

28

的重点SettingWithCopy是警告用户您可能正在做一些不会像人们预期的那样更新原始数据框的事情。

这里,data是一个数据框,可能是单个 dtype(或不是)。然后,您将参考data['amount']这是一个系列,并对其进行更新。这可能适用于您的情况,因为您返回的数据类型与现有数据相同。

但是,它可以创建一个副本来更新data['amount']您看不到的副本;然后你会想知道为什么它不更新。

Pandas 几乎在所有方法调用中都会返回一个对象的副本。这些inplace操作是一种可行的操作,但通常不清楚数据正在被修改并且可能在副本上工作。

这样做更清楚:

data['amount'] = data["amount"].fillna(data.groupby("num")["amount"].transform("mean"))

data["amount"] = data['amount'].fillna(mean_avg)

处理副本的又一优势。您可以链接操作,这是不可能inplace的。

例如

data['amount'] = data['amount'].fillna(mean_avg)*2

仅供参考。inplace操作既不是更快也不是内存效率更高。my2c 他们应该被禁止。但在那个 API 上为时已晚。

你当然可以关闭它:

pd.set_option('chained_assignment',None)

Pandas 与整个测试套件一起运行,并设置为raise(所以我们知道是否发生了链接),仅供参考。

于 2014-01-30T17:49:49.350 回答