2015-04-29 3 views
1

Я пытаюсь центрировать (вычесть среднее) срез столбца. Таким образом, в следующем примере я бы выполнил поиск по supercase (var, что группы наблюдений принимают среднее значение, а затем назначают в том же положении старое значение минус среднее значение). Я работал с большим dataframe (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() 

(я понимаю, что группа с одним наблюдением будет иметь центрированный значение, равное нулю)

тем не менее, и после ожидания в течение совсем немного (с оригинальным ФР), я получаю следующее предупреждение:

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: 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

Я не уверен, что могу дать вам отличное объяснение этому предупреждению, кроме того, что содержится в документации, но похоже, что вы все хорошо работали, и это предупреждение не всегда применяется, даже когда оно появляется.

Тем не менее, существует гораздо более быстрый и простой способ сделать то, что вы хотите, достаточно близко к примеру groupby() в документации here.

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 

С точки зрения получения копии dataframe, это стандартный способ:

test_ctr = test.copy() 

Я предположил бы, что вы пытались test_ctr = pd.DataFrame(test) бы работал, но, по-видимому, нет!

+0

Большое спасибо за groupby(), действительно, я не привык к этому. Я ожидал бы, что test_ctr = pd.DataFrame (test) будет работать так, как это делается с базовыми объектами, например. x = list (y)! – Animismus

Смежные вопросы