2014-01-30 25 views
13

我一直在閱讀這個link關於「返回視圖與副本」。我真的不明白Pandas中的概念如何工作,.ix().iloc().loc()的使用如何影響它。熊貓:鏈接作業

我得到的SettingWithCopyWarning警告,代碼如下行,其中data是熊貓據幀和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:" 

回答

18

SettingWithCopy的一點是要提醒你可能做一些正如人們所預料不會更新原始數據幀中的用戶。

這裏,data是一個數據幀,可能是單個dtype(或不)。然後,您將參考此係列的data['amount']並更新它。這可能適用於你的情況,因爲你正在返回與現有數據相同的dtype。

但是它可能創建一個副本更新的data['amount'],你不會看到一個副本;那麼你會想知道爲什麼它沒有更新。

Pandas在幾乎所有方法調用中返回一個對象的副本。 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運行(所以我們知道,如果鏈正在發生的事情)上,供參考。

+0

謝謝傑夫,所以我應該理想地去除第二次和第三次警告的'inplace'參數。關於第一個,即data ['amount'] = data ['amount'] .stype(float)',什麼是不會產生複製警告的替換? – Rhubarb

+0

你必須在* astype分配之前做一些事*。你能展示更多的代碼嗎? – Jeff

+0

當然,我將代碼添加到我的問題。 – Rhubarb