pandas:链接作业

我一直在阅读“回到一个副本”的链接。 我真的不知道pandas的链接赋值概念是如何工作的,以及.ix() .iloc().loc()如何影响它。

对于以下代码行,我得到了SettingWithCopyWarning警告,其中data是pandas数据框, amount是该data SettingWithCopyWarning的列(系列)名称:

 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:" 

SettingWithCopy是警告用户,您可能正在做一些不会像原来预期的那样更新原始数据框的东西。

在这里, data是一个dataframe,可能是一个dtype(或不)。 然后,您正在参考这个data['amount']这是一个系列,并更新它。 这可能适用于你的情况,因为你正在返回与现有数据相同的dtype。

然而,它可以创build一个副本,更新您不会看到的data['amount']副本data['amount'] ; 那么你会想知道为什么它没有更新。

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

要做得更清楚一点:

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

还有一个优点是可以复制副本。 你可以连锁经营,这是不可能的。

例如

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

而只是一个FYI。 inplace操作既不快也不更有效。 my2c他们应该被禁止。 但是那个API太迟了。

你当然可以把它关掉:

 pd.set_option('chained_assignment',None) 

Pandas与整个testing套件一起运行,以raise (所以我们知道链接是否正在发生),FYI。