Я перевожу этот кусок кода sas в панд. Код sas в основном группирует наблюдения по ключу. Внутри каждой группы создается новая переменная A
, где A[0] = B[0]/C[0]/.25
. Тогда для i >= 1
A[i] = A[i - 1] *.85 + B[i]/C[i]
. B
и C
- другие переменные в кадре данных.
Я не думаю, что какой-либо df.groupby().attribute
Делает это.
data data;
set data2;
by key1 key2;
retain A;
if first.key1 then A = (B / C) /(.25);
else A = A * .85 + B / C;
run;
Ожидаемый результат для группы g01
key1 B C A
g01 1 2 2 2 = 1 / 2 /.25
g01 2 1 3.7 3.7 = 2 * .85 + 2 / 1
g01 2 4 3.645 3.645 = 3.7 * .85 + 2 / 4
Я думал о том, чтобы сначала получить ключи группы и прокрутить их имена. Но может быть, есть лучший способ?
Следующее решение работает с использованием pd.iterrows()
, учитывая, что у вас есть DataFrame df
содержащий столбцы B
и C
которые содержат значения, а также столбец key1
который содержит имя группы:
g = None
for i, r in df.iterrows():
if g != r.key1:
a = r.B / r.C / .25
else:
a = a * .85 + r.B / r.C
df.loc[i, 'A'] = a
g = r.key1
Невозможно решить эту проблему параллельным способом из-за зависимости цикла, о чем свидетельствует ваше использование [i - 1]
и мое кэширование переменных a
и g
.
if not a
было правильно, как и !=
Который проверяет изменение группы. Возможно, вам придется сначала отсортировать данные по группам, чтобы это работало.