我一直在阅读这个关于“返回视图与复制”的链接。我并不真正理解链赋值概念在Pandas中是如何工作的,以及.ix()、.iloc()或.loc()的使用如何影响它。
我得到了以下代码行的SettingWithCopyWarning警告,其中data是Panda dataframe,amount是该dataframe中的列(系列)名称:
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:"发布于 2014-01-30 17:49:49
SettingWithCopy的目的是警告用户,您可能正在做一些不像人们所期望的那样更新原始数据框架的事情。
在这里,data是一个dataframe,可能是单一的dtype (或者不是)。然后,您将引用这个data['amount'],它是一个系列,并对其进行更新。这在您的情况下可能有效,因为您正在返回与现有数据相同的数据类型。
但是,它可以创建一个副本来更新您看不到的data['amount']副本;然后您可能会想知道为什么它没有更新。
熊猫在几乎所有的方法调用中都返回一个对象的副本。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)熊猫运行与整个测试套件与此设置为raise (所以我们知道是否发生链接),FYI。
https://stackoverflow.com/questions/21463589
复制相似问题