Zhu*_*arb 15 python copy pandas chained-assignment
我一直在阅读这个链接的"返回视图与副本".我真的不明白的是如何链接分配在熊猫的概念工作和如何的使用.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)
Run Code Online (Sandbox Code Playgroud)
看看这段代码,我做的事情显然不是很理想吗?如果是这样,你能告诉我更换代码行吗?
我知道下面的警告,并且认为我的案例中的警告是误报:
链式分配警告/异常旨在通知用户可能无效的分配.可能存在误报; 无意中报告链式作业的情况.
编辑:导致第一次复制警告错误的代码.
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:"
Run Code Online (Sandbox Code Playgroud)
Jef*_*eff 25
关键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)
Run Code Online (Sandbox Code Playgroud)
还有一个工作副本.你可以链接操作,这是不可能inplace
的.
例如
data['amount'] = data['amount'].fillna(mean_avg)*2
Run Code Online (Sandbox Code Playgroud)
只是一个FYI.inplace
操作既不是更快也不是更高效的内存.my2c他们应该被禁止.但是那个API太迟了.
你当然可以关闭它:
pd.set_option('chained_assignment',None)
Run Code Online (Sandbox Code Playgroud)
Pandas与整个测试套件一起运行raise
(我们知道链接是否正在发生),仅供参考.