熊猫:连锁分配熊猫:连锁分配(Pandas: Chained assignments)

2019-05-08 23:52发布

I have been reading this link on "Returning a view versus a copy". I do not really get how the chained assignment concept in Pandas works and how the usage of .ix(), .iloc(), or .loc() affects it.

I get the SettingWithCopyWarning warnings for the following lines of codes, where data is a Panda dataframe and amount is a column (Series) name in that 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)

Looking at this code, is it obvious that I am doing something suboptimal? If so, can you let me know the replacement code lines?

I am aware of the below warning and like to think that the warnings in my case are false positives:

The chained assignment warnings / exceptions are aiming to inform the user of a possibly invalid assignment. There may be false positives; situations where a chained assignment is inadvertantly reported.

EDIT : the code leading to the first copy warning error.

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

Answer 1:

该点SettingWithCopy是警告,你可能会做的事情将不会更新如想象中的原始数据帧中的用户。

这里, data是一个数据帧,可能单个D型(或不)的。 然后你正在服用该基准data['amount']这是一个系列,并更新它。 这可能工作在你的情况,因为你的存在返回的数据相同的D型。

然而,它可以创建一个副本更新的副本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 (所以我们知道,如果链正在发生的事情)上,供参考。



文章来源: Pandas: Chained assignments