2015-04-29 42 views
1

我想中心(減去平均值)的切片的列。因此,在下面的例子中,我將通過超級搜索進行搜索(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被修改的情況下?

乾杯和謝謝!

回答

0

我不確定我可以給你一個關於超出文檔內容的警告的很好的解釋,但是看起來你所做的工作正常,即使出現警告也不總是適用。

儘管如此,在文檔here中有一個更快更簡單的方法來完成您想要的操作,它與groupby()示例相當接近。

test[['Var1','Var2','Var3','supercase']] 

     Var1  Var2  Var3 supercase 
0 0.107989 0.275314 0.688784  1000 
1 0.743372 0.726421 0.457137  1000 
2 0.946661 0.469229 0.145584  2000 
3 0.562564 0.040528 0.150148  2000 
4 0.213042 0.934673 0.713870  2000 
5 0.851200 0.371629 0.239308  2000 
6 0.555617 0.502027 0.862414  3000 
7 0.386040 0.954245 0.392592  3000 
8 0.431534 0.088997 0.016639  3000 
9 0.207693 0.269625 0.189688  4000 

test.groupby('supercase')[_vars].transform(lambda x: x - x.mean()) 

     Var1  Var2  Var3 
0 -0.317692 -0.225554 0.115823 
1 0.317692 0.225554 -0.115823 
2 0.303294 0.015214 -0.166643 
3 -0.080803 -0.413487 -0.162079 
4 -0.430325 0.480658 0.401643 
5 0.207833 -0.082386 -0.072920 
6 0.097887 -0.013063 0.438533 
7 -0.071691 0.439156 -0.031290 
8 -0.026196 -0.426092 -0.407242 
9 0.000000 0.000000 0.000000 

在得到一個數據幀的副本而言,這是標準的方式:

test_ctr = test.copy() 

我能猜到你試過test_ctr = pd.DataFrame(test)會還努力但顯然不是!

+0

非常感謝groupby(),的確我不習慣它。我期望test_ctr = pd.DataFrame(test)可以像使用基本對象那樣工作,例如, x = list(y)! – Animismus