Как написать оператор if из SAS в python - PullRequest
2 голосов
/ 01 апреля 2019

Я пользователь SAS, который пытается преобразовать код SAS в версию Python.

Я создал код SAS, как показано ниже, и у меня есть некоторые проблемы, которые необходимо применить к языку Python.Предположим, у меня есть таблица данных, которая содержит поля от возрастов1 до старения60, и я хочу создать два новых поля с именами «life_def» и «obs_time».Эти два поля содержали значение как 0 и будут изменены в зависимости от условий других полей, которые устарели от 1 до ста. 60 *

data want;
set have;
array aging_array(*) aging1--aging60;

life_def=0;
obs_time=0;

do i to 60;
     if life_def=0 and aging_array[i] ne . then do;
          if aging_array[i]>=4 then do;
               obs_time=i;
               life_def=1;
               end;
     if aging_array[i]<4 then do;
               obs_time=i;
               end;
           end;
end;

drop i;
run;

Я пытался воссоздать вышеуказанный код SAS в версию Python, но это не такхотя я работаю.Ниже приведен код, над которым я сейчас работаю.

df['life_def']=0
df['obs_time']=0

for i in range(1,lag+1):
    if df['life_def'].all()==0 and pd.notnull(df[df.columns[i+4]].all()):
        condition=df[df.columns[i+4]]>=4
        df['life_def']=np.where(condition, 1, df['life_def'])
        df['obs_time']=np.where(condition, i, df['obs_time'])

Предположим, df [df.columns [i + 4]] - это мои столбцы старения в SAS.Используя приведенный выше код, цикл продолжается, когда я увеличивается.Тем не менее, логика SAS предусматривает остановку i при первом старении> = 4.

Например, если age7> = 4 (в первый раз) life_def будет 1, а obs_time будет 7 и назначитследующий цикл, который равен 8.

Спасибо!

1 Ответ

0 голосов
/ 03 апреля 2019

Ваша цель состоит в том, чтобы получить первый aging**x** столбец x (на строку), который является ge 4. Фрагмент ниже будет делать то же самое.

Примечание. Я использую python 2.7

mydf['obs_time'] = 0

agingcols_len = len([k for k in mydf.columns.tolist() if 'aging' in k])
rowcnt = mydf['aging1'].fillna(0).count()

for k in xrange(rowcnt):
    isFirst = True
    for i in xrange(1, agingcols_len):
        if isFirst and mydf['aging' + str(i)][k] >= 4:
            mydf['obs_time'][k] = i
            isFirst = False
        elif isFirst and mydf['aging' + str(i)][k] < 4:
            pass

Я загрузил данные, которые я использовал для проверки вышеуказанного.То же самое можно найти здесь .

Фрагмент перебирает все столбцы aging**x** (например, - aging1, aging2) и продолжает увеличивать obs_time до тех пор, покабольше или равно 4через.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...