2015-06-25 64 views
0

按我的其他問題: Python Anaconda: how to test if updated libraries are compatible with my existing code?蟒蛇熊貓0.16:SettingWithCopyWarning錯誤報告

我詛咒我被迫升級到大熊貓0.16天。 的事情之一,我不明白的是爲什麼我得到一個鏈接分配警告,當我做的平庸如添加一個新的領域,以現有的數據幀,並用1初始化它的東西:

mydataframe['x']=1 

導致以下警告:

SettingWithCopyWarning:嘗試在DataFrame的 切片副本上設置一個值。嘗試使用的.loc [row_indexer,col_indexer] = 值代替

查看的文檔中的的告誡: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy mydataframe [ 'X'] = 1

我明白有可能出現問題時,分配給值複製到一個數據框的副本,但在這裏我只是添加一個新的字段到數據框!我應該如何改變我的代碼(這在以前版本的熊貓中完美運行)?

+0

除非你提供一個完全獨立的例子中,我們無法分辨它是否是一個錯誤,或者如果它是你忽略的文檔很長一段時間,它的只有現在它已被揭示。 – DSM

+0

我確實提供了這個例子。我加載一個數據框,然後是上面複製的單行代碼:mydataframe ['x'] = 1是觸發警告的那一行 –

+0

對不起,但是如果'mydataframe'原來是你的原始df,而不是複製或片/那麼這個警告就不會出現,也就是SO *真的是這個地方呻吟的地方嗎?你不應該用MVCE發佈[github](https://github.com/pydata/pandas/issues)上的內容嗎? – EdChum

回答

1

下面是一個答案的嘗試,或者至少試圖重現該消息。 (請注意,您只能得到這個消息後,可能需要啓動一個新的外殼或做%reset在IPython中得到這個消息。)

In [1]: %reset 

Once deleted, variables cannot be recovered. Proceed (y/[n])? y 

In [2]: import pandas as pd 

In [3]: pd.__version__ 
Out[3]: '0.16.0' 

這裏有一個新的列設置爲「1」的3個變化。前兩個不會產生警告,但第三個會發出警告。 (第二個感謝@傑夫的建議)

In [4]: df = pd.DataFrame({ 'x':[1,2,3], 'y':[77,88,99] }) 
    ...: df['z'] = 1 

In [5]: df = pd.DataFrame({ 'x':[1,2,3], 'y':[77,88,99] }) 
    ...: df = df[1:] 
    ...: df['z'] = 1 

In [6]: df = pd.DataFrame({ 'x':[1,2,3], 'y':[77,88,99] }) 
    ...: df2 = df[1:] 
    ...: df2['z'] = 1 

-c:3: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable 
/indexing.html#indexing-view-versus-copy 

也許別人可以糾正我,如果我錯了,但我相信在這裏的錯誤消息有關df2是的df片的副本。然而,這不是一個真正的問題,因爲所產生的dfdf2是什麼,我本來期望:

In [7]: df 
Out[7]: 
    x y 
0 1 77 
1 2 88 
2 3 99 

In [8]: df2 
Out[8]: 
    x y z 
1 2 88 1 
2 3 99 1 

我知道這將是可怕的說,但是當我得到消息,我剛剛檢查,看看是否該命令做了我想要或不想做的事情,不要過度考慮警告。但是不管你是否收到警告信息,檢查一個命令是否符合你的期望,這實際上是你需要在熊貓(或matlab,或R,或SAS,或Stata,...)中始終做的事情。

+0

注意,如果在例子的第二部分,如果你這樣做:''df = df [1:]; df ['z'] = 1''。你不會得到一個警告(也許顯示這個)。警告的發生是因爲在某些被切片的東西上設置了一列,然後設置,IOW,其解因子與df [1:] ['z'] = 1'相同,並期待它的工作。 – Jeff

+0

@Jeff謝謝,我向代碼添加了您的建議。如果你有這樣的傾向,請寫出更完整的答案。我完全不理解這一點,只是試圖幫助解決這個問題。 – JohnE

+0

你有一個很好的解釋。 – Jeff

0

這不會產生警告:

df = pd.DataFrame({ 'x':[1,2,3], 'y':[77,88,99] }) 
df2 = df[1:].copy() 
df2['z'] = 1 
+0

....但是它有理想的行爲嗎? –