如何将if语句从SAS写入python

如何将if语句从SAS写入python,python,sas,Python,Sas,我是一名SAS用户,尝试将SAS代码转换为python版本 我已经创建了如下SAS代码,并且有一些问题需要应用到python语言中。假设我有一个数据表,其中包含aging1到aging60的字段,我想创建两个新字段,分别命名为“life_def”和“obs_time”。这两个字段包含的值为0,将根据其他字段(aging1到aging60)的条件进行更改 data want; set have; array aging_array(*) aging1--aging60; life_def=0;

我是一名SAS用户,尝试将SAS代码转换为python版本

我已经创建了如下SAS代码,并且有一些问题需要应用到python语言中。假设我有一个数据表,其中包含aging1到aging60的字段,我想创建两个新字段,分别命名为“life_def”和“obs_time”。这两个字段包含的值为0,将根据其他字段(aging1到aging60)的条件进行更改

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;
假设df[df.columns[i+4]]是我在SAS中的老化列。通过使用上面的代码,当i增加时循环将继续。然而,SAS提供的逻辑在老化>=4的第一时间为stop i

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


谢谢大家!

您的目标是获得第一个
老化**x**
列的
x
(每行),即ge 4。下面的代码片段也会做同样的事情

注意-我使用的是python 2.7

mydf['obs_time']=0
agingcols_len=len([k表示mydf.columns.tolist()中的k,如果k中的'aging')
rowcnt=mydf['aging1'].fillna(0.count())
对于X范围内的k(rowcnt):
isFirst=True
对于X范围内的i(1,agingcols_len):
如果isFirst和mydf['aging'+str(i)][k]>=4:
mydf['obs_time'][k]=i
isFirst=False
elif isFirst和mydf['aging'+str(i)][k]<4:
通过
我已经上传了用于测试上述内容的数据。同样的情况也可以找到

该代码段迭代所有
老化**x**
列(例如-
aging1
aging2
),并不断增加
obs_时间
,直到其大于或等于4。整个过程使用
k
DataFrame
行上迭代


仅供参考-但是,当您有一百万行要循环时,速度会非常慢

我认为在这种特殊情况下,尝试进行“直接”转换是不实际的,我怀疑有一些python函数可以大大简化这种逻辑。总的逻辑是什么,找到超过4的第一条记录?@Reeza Hi,后面的逻辑是计算python中第二个块在每个循环中不起作用的时间是多少?什么是错误消息?我在第7行看到一个打字错误:括号
太多了。--><代码>如果df['aging'+str(i)]>=4:@stallingOne我已经编辑了代码,但结果与SAS不符。对此有什么建议吗?这是一个列表还是一个数据帧?仅供参考-上面的python代码片段将模拟SAS数据步骤。可能还有其他优化方法来实现所需的输出和逻辑。感谢分享,我将尝试一下。
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'])
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