2015-05-19 26 views
0

在下面的一段代碼中,我將DataFrame的點按它們的X值分組到bin。現在我想給Y列分配一個組ID,但大熊貓不斷給我發出類型爲SettingWithCopyWarning的警告。我究竟做錯了什麼?更改熊貓羣組列拋出警告

import numpy as np 
import pandas as pd 
d = np.random.random((10, 2)) 
d[:, 1] = 0 
m = pd.DataFrame(d, columns=("x", "gid")) 
dx = 0.2 
grp = m.groupby(lambda i: int(m["x"][i]/dx)) 
gid = 1 
for name, group in grp: 
    group["gid"][:] = gid # This line crashes! 
    gid += 1 
print(m) 

這裏是拋出的警告:

/usr/lib/python3.4/site-packages/pandas/core/series.py:677: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame 

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    self._set_with(key, value) 
sys:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame 

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

看一看http://stackoverflow.com/a/16949498/1571826了更優雅靈活的分檔方法。 –

+0

你使用的是什麼版本的熊貓?我也在運行python 3.4,並且我完全按照原樣運行代碼時沒有收到任何警告。 – KCzar

+0

在python 3.4.3,pandas 0.16.1和numpy 1.9.2中工作正常 – EdChum

回答

1

有兩個問題在這裏。首先,您得到SettingWithCopyWarning,因爲

group["gid"][:] = gid 

使用「鏈接索引」。問題在於,有時group[...]可能會返回副本而不是視圖group,因此進一步索引和修改副本,例如, group[...][...] = gidmay be useless since it only modifies the copy而不是groupSettingWithCopyWarning警告在分配中檢測到鏈接索引。這並不一定意味着任何問題。在你的情況下,group["gid"]返回group的視圖,所以你的鏈接索引恰好成功地修改了group本身。

儘管如此,推薦的做法是總是在執行分配時避免鏈接索引,因爲預測鏈接索引是否會返回視圖或副本並不總是很容易。

通常你可以通過使用.lociloc避免鏈接索引:

group.loc[:, "gid"] = gid 

的第二個問題是,即使我們避免了鏈式索引,修改group不修改m

當您使用for-loop

for name, group in grp: 

Python中創建的局部變量namegroupgrp綁定這些變量的項目。但這些項目本身,而不是意見,部分m。因此修改這些副本不會影響m


而不是使用GROUPBY的,你可以使用pd.Categorical

import numpy as np 
import pandas as pd 
np.random.seed(2015) 
d = np.random.random((10, 2)) 
d[:, 1] = 0 
m = pd.DataFrame(d, columns=("x", "gid")) 
dx = 0.2 
m['gid'] = pd.Categorical((m['x']/dx).astype(int)).codes + 1 

print(m) 

產生

  x gid 
0 0.737595 3 
1 0.884189 4 
2 0.944676 4 
3 0.063603 1 
4 0.332454 2 
5 0.003218 1 
6 0.071058 1 
7 0.289020 2 
8 0.268896 2 
9 0.258775 2