我有25个变量DXCODE1到DXCODE25,我想扫描它们以查看每行的这些值是否与icd_list匹配。例如,在每一行中,我想从DXCODE1扫描到DXCODE25,看看是否有任何一个包含以下三个值中的任何一个:' F32',' F33',& #39; F34',如果确实如此,那么我想返回1.我尝试了以下内容:
def scan_icd (row):
icd_list = ['F32', 'F33', 'F34']
for i in range(1, 26):
dx_code_loc = 'DXCODE' + str(i)
for j in range(0, len(icd_list)):
if icd_list[j] in row[dx_code_loc]:
return 1
df['ICD_DX'] = df.apply(scan_icd, axis=1)
但我收到了这个错误:
TypeError: ("argument of type 'float' is not iterable", 'occurred at index 1')
此外,我想使其灵活,以便我可以以某种方式将icd代码指定为参数中的列表。但我不知道如何应用语法:
def scan_icd (row, icd_list):
icd_list = icd_list
for i in range(1, 26):
dx_code_loc = 'DXCODE' + str(i)
for j in range(0, len(icd_list)):
if icd_list[j] in row[dx_code_loc]:
return 1
df['ICD_DX'] = df.apply(scan_icd (['F32', 'F33', 'F34']), axis=1)
TypeError: apply() got multiple values for argument 'axis'
===================
编辑:
列标记为DXCODE1,DXCODE2,... DXCODE25
答案 0 :(得分:2)
我认为apply
会完成你想要的工作
icd_list = ['F32', 'F33', 'F34']
df['ICD_DX'] = df.apply(lambda row: 1 if row.isin(icd_list).any() else 0, axis=1)
您检查icd_list
row
的任何元素
编辑:如果你想保留你的for循环(抱歉,我最初没有看到这个要求)我会这样做:
def scan_icd (row, icd_list):
for i in range(1, 26):
dx_code_loc = 'DXCODE' + str(i)
for j in range(0, len(icd_list)):
if icd_list[j] in row[dx_code_loc]:
return 1
return 0 # return 0 if none match
icd_list = ['F32', 'F33', 'F34']
df['ICD_DX'] = df.apply(scan_icd, args=([icd_list]), axis=1)
# note the list of the list icd_list in args
编辑2:要指定列,您可以执行以下操作:
list_col = ['DXCODE' + str(i) for i in range(1,26)]
df['ICD_DX'] = df.apply(lambda row: 1 if row[list_col].isin(icd_list).any() else 0, axis=1)
# see the difference is with row[list_col]