我是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。
谢谢!
答案 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
行。
仅供参考-但是,当您要遍历百万行时,这非常慢。