我们有一个相当大的关于美国死亡率的数据集。我们只使用了2010-2016年的数据,需要复制在SAS中创建两个标志列所做的工作:一个用于糖尿病,另一个用于高血压,来自20个名为ENICON1-20的列的编码值,属于数据类型对象,但仅适用于前三个位置或行。你知道吗
这是在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到flag列。你知道吗
我们尝试过这样的方法,它只返回“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"
但这正在消耗我们的内存,而且在我们的一些计算机上无法运行。我们知道必须要有一个有效的方法,更像Python的方法,我们只是不知道那可能是什么方法。你知道吗
不确定这是否正是您需要的:
所以,这应该是合适的代码了。在'else'的情况下有
df['flag']
是很重要的。否则,如果df['ENICON20'].isin(['E10','E11','E12','E13','E14'])
为False,则覆盖“Y”标志!你知道吗相关问题 更多 >
编程相关推荐