基于前3行中其他列的值创建标志列(Y/N)

2024-09-22 10:25:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个相当大的关于美国死亡率的数据集。我们只使用了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的方法,我们只是不知道那可能是什么方法。你知道吗


Tags: ofto方法returnifrowflagdiabetes
1条回答
网友
1楼 · 发布于 2024-09-22 10:25:18

不确定这是否正是您需要的:

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'])为False,则覆盖“Y”标志!你知道吗

相关问题 更多 >