Я пытаюсь центрировать (вычесть среднее) срез столбца. Таким образом, в следующем примере я бы выполнил поиск по 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?
Приветствия и благодарности!
Большое спасибо за groupby(), действительно, я не привык к этому. Я ожидал бы, что test_ctr = pd.DataFrame (test) будет работать так, как это делается с базовыми объектами, например. x = list (y)! – Animismus