Python 熊猫:链式作业

Python 熊猫:链式作业,python,pandas,copy,chained-assignment,Python,Pandas,Copy,Chained Assignment,我一直在读这篇关于“返回视图与副本”的文章。我真的不知道熊猫中的链式赋值概念是如何工作的,以及.ix()、.iloc()或.loc()的使用是如何影响它的 我获得以下代码行的设置和copywarning警告,其中数据是熊猫数据框,金额是该数据框中的列(系列)名称: data['amount'] = data['amount'].astype(float) data["amount"].fillna(data.groupby("num")["amount"].transform("mean"),

我一直在读这篇关于“返回视图与副本”的文章。我真的不知道熊猫中的链式赋值概念是如何工作的,以及
.ix()
.iloc()
.loc()
的使用是如何影响它的

我获得以下代码行的
设置和copywarning
警告,其中
数据
是熊猫数据框,
金额
是该数据框中的列(系列)名称:

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

设置with copy
的目的是警告用户,您所做的操作可能不会像预期的那样更新原始数据帧

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

但是,它可以创建一个副本,更新您看不到的
数据['amount']
副本;然后你会想为什么它没有更新

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

要做到这一点更为明确:

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

data["amount"] = data['amount'].fillna(mean_avg)
还有一个额外的优点就是复印件。您可以链接操作,这在
inplace
操作中是不可能的

e、 g

仅供参考<代码>就地操作既不更快,也不更节省内存。my2c他们应该被禁止。但是在那个API上太晚了

当然,您可以关闭此选项:

pd.set_option('chained_assignment',None)

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

谢谢Jeff,因此我最好删除第二次和第三次警告的
inplace
参数。关于第一个,即
data['amount']=data['amount'].astype(float)
,什么样的替换不会产生复制警告?您必须在astype分配之前做些什么。你能显示更多的代码吗?当然,我在问题中添加了代码。你能在此之前显示
data.info()
?您应该已经有了
float64
d类型。第二,你不需要申请,你可以这样做:
data[data['currency']!='A','amount']=data['qty']*data['rate']
谢谢@Jeff提供这个解决方案:pd.set_选项('chained_assignment',None),但是我想知道这是否是推荐的,因为我在更改默认警告设置时总是很保守。。。
pd.set_option('chained_assignment',None)