如何通过使用forloops扫描多个列来创建一个新的pandas列?

2024-10-03 04:36:59 发布

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

我有25个变量DXCODE1到DXCODE25,我想扫描一下,看看每一行的这些值是否与icd\u列表匹配。例如,在每一行中,我要扫描从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型


Tags: indfforscancoderangeloclist
1条回答
网友
1楼 · 发布于 2024-10-03 04:36:59

我想这个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]

相关问题 更多 >