我想中心(減去平均值)的切片的列。因此,在下面的例子中,我將通過超級搜索進行搜索(var分組觀察值取平均值,然後在相同位置分配舊值減平均值)。我是用一個更大的數據幀的工作(477行×85列),所以我做了一個測試DF表明我的觀點修改列的小切片的值
import random as rd
# 10 row by 3 columns dataframe with random floats
test = pd.DataFrame([[rd.random() for n in range(3)] for n in range(10)], columns = ["Var{}".format(n+1) for n in range(3)])
# supercase column to group observations (rows)
test["supercase"]=[1000]*2+[2000]*4+[3000]*3+[4000]
# random metadata for fluff
for n,_lett in zip(range(3),list("abc")):
test["metadata{}".format(n+1)]=[_lett*int(rd.random()*10) for i in range(len(test.index))]
# get the vars I want to work on
_vars = test.columns[:3]
# get a list of supercases to work on
supercases = test.supercase.unique()
# go through the calculations
for var in _vars:
for sc in supercases:
test[var][test.supercase == sc]=test[var][test.supercase == sc]-test[var][test.supercase == sc].mean()
(我認識到,一個觀察組將具有零中心值)
儘管如此,並等待相當多的(與原來的DF)之後,我得到以下警告:
C:\Python27\lib\site-packages\IPython\kernel\__main__.py:5: 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
我不知道究竟意味着什麼,所以我試圖創建DF副本並對新df進行歸因: test_ctr = pd.DataFrame(te st)#以避免兩個變量指向同一個對象。
for var in _vars:
for sc in supercases:
test_ctr[var][test_ctr.supercase == sc]=test[var][test.supercase == sc]-test[var][test.supercase == sc].mean()
這讓我注意到test_ctr(如預期的)和測試都被修改了,這讓我更加困惑。
這應該怎麼做呢? 上面的鏈接介紹了以下爲有道這將使必須保存索引值:
dfc.loc[0,'A'] = 11
有沒有辦法,我失去了一些東西?特別是在測試df被修改的情況下?
乾杯和謝謝!
非常感謝groupby(),的確我不習慣它。我期望test_ctr = pd.DataFrame(test)可以像使用基本對象那樣工作,例如, x = list(y)! – Animismus