Создайте новую переменную, зависящую от цикла, перебирая строки

1

Я перевожу этот кусок кода 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

Я думал о том, чтобы сначала получить ключи группы и прокрутить их имена. Но может быть, есть лучший способ?

  • 3
    Пожалуйста, дайте образец ввода и вывода, кто-то может быть вам помочь
  • 0
    Вы можете проверить функцию применения, которую вы можете передать с помощью groupby, однако нам потребуются примеры данных и вывод, как сказал @Kiran, чтобы воспроизвести проблему и найти какое-либо решение. :)
Показать ещё 1 комментарий
Теги:
pandas
sas

1 ответ

0

Следующее решение работает с использованием 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.

  • 0
    Спасибо за помощь! Два вопроса: 1. это работает по группам? Эта программа, кажется, iter по всему фрейму данных. 2. вместо «если не а» вы имеете в виду «если а»? Расчет для первого в каждой группе должен отличаться от остальной группы
  • 0
    1. Да, сейчас. Я перечитал ваш вопрос и адаптировал ответ. 2. if not a было правильно, как и != Который проверяет изменение группы. Возможно, вам придется сначала отсортировать данные по группам, чтобы это работало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню