我一直在阅读link关于“返回视图与副本”的内容。我真的不知道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:"
答案 0 :(得分:22)
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
来实现链操作。
e.g。
data['amount'] = data['amount'].fillna(mean_avg)*2
只是一个FYI。 inplace
操作既不是更快也不是更高的内存效率。 my2c他们应该被禁止。但是那个API太迟了。
你当然可以关闭它:
pd.set_option('chained_assignment',None)
Pandas运行整个测试套件,其设置为raise
(所以我们知道链接是否正在发生),仅供参考。