如何将if语句从SAS写入python

时间:2019-04-01 11:23:06

标签: python sas

我是SAS用户,试图将SAS代码转换为python版本。

我已经创建了如下的SAS代码,并且存在一些适用于python语言的问题。假设我有数据表,其中包含从ageing1到ageing60的字段,并且我想创建两个新字段,分别名为“ 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中老化的列。通过使用上面的代码,当i增加时,循环将继续。但是,提供的SAS逻辑在第一个衰老> = 4时在第i个停止。

例如,如果老化7> = 4(第一次),则life_def将为1,obs_time将为7,并分配下一个循环,即8。

谢谢!

1 个答案:

答案 0 :(得分:0)

您的目标是获取第一列aging**x**的{​​{1}}(每行),即ge4。下面的代码片段将做同样的事情。

注意-我正在使用python 2.7

x

我已经上传了用于测试上述数据的数据。可以找到here

该代码段遍历所有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直到其大于或等于4。这整个过程用obs_time遍历DataFrame行。

仅供参考-但是,当您要遍历百万行时,这非常慢。