Python 如何通过使用for循环扫描多个列来创建新列?

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_

我有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_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()
by
row[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()
by
row[list\u col].str.contains('|').join(icd\u list))。any()
在我的编辑2中,它应该可以完成这项工作