Python 如何通过使用for循环扫描多个列来创建新列?
我有25个变量DXCODE1到DXCODE25,我想对它们进行扫描,看看每行的这些值是否与icd_列表匹配。例如,在每一行中,我想从DXCODE1扫描到DXCODE25,看看其中是否有任何一个包含以下三个值中的任何一个:“F32”、“F33”、“F34”,如果有,那么我想返回1。我尝试了以下方法:Python 如何通过使用for循环扫描多个列来创建新列?,python,pandas,function,dataframe,filter,Python,Pandas,Function,Dataframe,Filter,我有25个变量DXCODE1到DXCODE25,我想对它们进行扫描,看看每行的这些值是否与icd_列表匹配。例如,在每一行中,我想从DXCODE1扫描到DXCODE25,看看其中是否有任何一个包含以下三个值中的任何一个:“F32”、“F33”、“F34”,如果有,那么我想返回1。我尝试了以下方法: def scan_icd (row): icd_list = ['F32', 'F33', 'F34'] for i in range(1, 26): dx_code_
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我想这个
应用
可以完成你想要的工作
icd_list = ['F32', 'F33', 'F34']
df['ICD_DX'] = df.apply(lambda row: 1 if row.isin(icd_list).any() else 0, axis=1)
检查icd\U列表的任何元素是否在您的行中
编辑:如果您想保留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]
我想这个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\U列表的任何元素是否在您的行中
编辑:如果您想保留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]
是否每列都标记为DXCODE1、DXCODE2、。。。依此类推?是的,我在上面添加了编辑。好的,为了澄清,您想看看哪些行在25列中的任何一列中包含icd_代码?我想看看哪些行在25列中的任何一列中至少包含一个指定icd代码。每列是否标记为DXCODE1、DXCODE2。。。依此类推?是的,我在上面添加了as编辑。好的,为了澄清,你想看看哪些行在25列中的任何列中包含icd_代码?我想看看哪些行在25列中的任何列中至少包含一个指定的icd代码。有没有办法指定只扫描这25列?谢谢,我正在尝试循环代码。我得到了同样的错误-TypeError:(“类型为'float'的参数不可编辑”,“发生在索引1”)没有您的输入数据,我不确定我能帮上忙,我创建了自己的df,它对我有效。我猜,如果第[dx\U code\U loc]行中的icd\U列表[j]
,则错误发生在第行。您的“编辑2”代码正常工作,但很抱歉,我之所以喜欢“编辑”(如果正常工作),是因为只要文本中包含“F32”,它就会返回1。例如,“F32”、“F32.1”和“F32343”等内容都会返回1。你能指导我如何在编辑2中包含这个“regex”概念吗?好的,替换row[list\u col].isin(icd\u list).any()
byrow[list\u col].str.contains('|').join(icd\u list))。any()
在我的编辑2中,它应该以任何方式指定只扫描那25列?谢谢,我正在尝试循环代码。我得到了同样的错误-TypeError:(“类型为'float'的参数不可编辑”,“发生在索引1”)没有您的输入数据,我不确定我能帮上忙,我创建了自己的df,它对我有效。我猜,如果第[dx\U code\U loc]行中的icd\U列表[j]
,则错误发生在第行。您的“编辑2”代码正常工作,但很抱歉,我之所以喜欢“编辑”(如果正常工作),是因为只要文本中包含“F32”,它就会返回1。例如,“F32”、“F32.1”和“F32343”等内容都会返回1。你能指导我如何在编辑2中包含这个“regex”概念吗?好的,替换row[list\u col].isin(icd\u list).any()
byrow[list\u col].str.contains('|').join(icd\u list))。any()
在我的编辑2中,它应该可以完成这项工作