我们有关于美国死亡率的相当大的数据集我们正在使用2010-2016年,并且需要复制在SAS中创建两个标志柱的工作:一个用于糖尿病,一个用于高血压,源自来自20列的编码值ENICON1-20,它们是dtype对象,但只对前三个位置或行。
这是SAS所做的:
* Create 2 flag variable to identify deaths * ;
* that had Diabetes or Hypertension as a contributing cause of death * ;
length diabetes_flag $1
hypertens_flag $1 ;
* Create an array to use to check Contributing Causes of Death * ;
array ent_cond[20] enicon1 - enicon20 ;
diabetes_flag = 'N' ;
hypertens_flag = 'N' ;
do i = 1 to 20 ;
* Check first three positions of each "Entity_Axis_Condition_Codes"
(1 -20) for Diabetes codes * ;
if substr(ent_cond[i],1,3) in('E10','E11','E12','E13','E14')
then diabetes_flag = 'Y' ;
* Check first three positions of each "Entity_Axis_Condition_Codes"
(1 - 20) for Hypertension codes * ;
if substr(ent_cond[i],1,3) in('I10','I12') then hypertens_flag = 'Y';
end ;
从上面的代码可以看出,我们正在寻找编码字符串的部分匹配(因为它们有很多),例如:'E10','E11','E12'等等。如果部分匹配在其中,那么它可以被转换为Y或N到标志列。
我们尝试了类似这样的东西,它只返回“N”,并且它不解析只有前三行:
def diabetes_flag(row):
if row['ENICON1'] == 'E10|E11|E12|E13|E14':
return 'Y'
if row['ENICON2'] == 'E10|E11|E12|E13|E14':
return 'Y'
if row['ENICON3'] == 'E10|E11|E12|E13|E14':
return 'Y'
if row['ENICON4'] == 'E10|E11|E12|E13|E14':
return 'Y'
if row['ENICON5'] == 'E10|E11|E12|E13|E14':
return 'Y'
if row['ENICON6'] == 'E10|E11|E12|E13|E14':
return 'Y'
if row['ENICON7'] == 'E10|E11|E12|E13|E14':
return 'Y'
if row['ENICON8'] == 'E10|E11|E12|E13|E14':
return 'Y'
if row['ENICON9'] == 'E10|E11|E12|E13|E14':
最多ENICON20 ...
其他:
返回'N'
然后应用函数:
mortdata['Diabetes_Flag'] = mortdata.apply(diabetes_flag, axis = 1)
仅返回'N',因为它不会查找部分匹配但完全匹配。
我们也尝试过(仅作为测试,仅使用一年的数据):
m2 = mort2010
m2['CON1'] = m2['ENICON1'].str[0:3]
m2['CON2'] = m2['ENICON2'].str[0:3]
m2['CON3'] = m2['ENICON3'].str[0:3]
m2['ENICON20'] = m2.to_string(columns = ['ENICON20'])
m2['CON20'] = m2['ENICON20'].str[0:3]
m2['DIABETES_FLAG'] = "N"
Dcodes = ["E10","E11"]
m2.loc[m2['CON1'].isin(Dcodes), ['DIABETES_FLAG']] = "Y"
但是这会让我们的记忆力下降并且不能在我们的某些计算机上运行。我们知道必须有一种有效的方式,更多的pythonic方式,我们只是不知道可能是那样。
答案 0 :(得分:1)
不确定这是否正是您所需要的:
df['flag'] ='N'
for i in range(1,21):
df['flag']=np.where(df['ENICON' + str(i)].isin(['E10','E11','E12','E13','E14']), 'Y', df['flag'])
所以,这应该是现在适当的代码。在'else'案例中使df['flag']
非常重要。否则,如果df['ENICON20'].isin(['E10','E11','E12','E13','E14'])
为假,则覆盖'Y'标志!