Присвоение значений столбцов сгруппированной таблице астропии в цикле
У меня есть сгруппированная таблица астропии, и я хотел бы перебрать группы и выполнить усеченное среднее значение для каждой группы отдельно.
MWE ниже иллюстрирует то, что я пытаюсь сделать. Когда код выполняется, он не выдает ошибку, а значения для столбца "c" просто остаются равными 0.0. Мне кажется, что я, возможно, в корне неправильно понимаю, как работает табличная среда, но не уверен, что именно.
import numpy as np
from astropy.table import Table
from astropy.stats import sigma_clip
a = np.array([5.7, 5.9, 5.1, 5.3, 5.7, 5.4, 6.0, 8.6, 6.4, 5.2])
b = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
c = np.zeros(len(a))
tab = Table( (a,b,c), names=('a','b','c'), masked=True )
tabGrp = tab.group_by('b')
for x in tabGrp.groups:
clipped = sigma_clip( x['a'], sigma=2)
x['c'] = clipped
1 ответ
Когда вы группируете свой tab
стол, новый groups
свойство добавлено.
Вы можете подать заявку sigma_clip()
на каждой tabGrp
группа, хранить только значения в списке, создать новый MaskedColumn с этими сохраненными значениями (правильно маскируя значения), и заменить старые c
колонка с новым обрезанным.
Это не очень элегантно, но, кажется, делает то, что вам нужно.
import numpy as np
from astropy.table import Table
from astropy.stats import sigma_clip
from astropy.table import MaskedColumn
a = np.array([5.7, 4.2, 5.1, 5.3, 5.7, 5.4, 6.0, 8.6, 6.4, 5.2])
b = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
c = np.zeros(len(a))
tab = Table((a, b, c), names=('a', 'b', 'c'), masked=True)
tabGrp = tab.group_by('b')
clipped = sigma_clip(tabGrp['a'], sigma=2)
col = []
for x in tabGrp.groups:
clipped = sigma_clip(x['a'], sigma=2)
# Save values only.
col += clipped.tolist()
# Create new masked column.
c_clipped = MaskedColumn(col, mask=[True if _ is None else False for _ in col])
# Replace old c column
tab['c'] = c_clipped
Что приводит к:
a b c
--- --- ---
5.7 0 5.7
4.2 0 4.2
5.1 0 5.1
5.3 0 5.3
5.7 1 5.7
5.4 1 5.4
6.0 1 6.0
8.6 1 --
6.4 1 6.4
5.2 1 5.2
Это то, что вы были после?